Postgres的级数生成函数generate_series应用

news/2024/7/9 21:16:00 标签: 数据库, postgresql

Postgres的级数生成函数generate_series应用

引用:http://postgres.cn/docs/12/functions-srf.html

函数文档

级数生成函数

函数	参数类型	返回类型	描述
generate_series(start, stop)	int、bigint或者numeric	setof int、setof bigint或者setof numeric(与参数类型相同)	产生一系列值,从start到stop,步长为 1
generate_series(start, stop, step)	int、bigint或者numeric	setof int、setof bigint或者setof numeric(与参数类型相同)	产生一系列值,从start到stop,步长为step
generate_series(start, stop, step interval)	timestamp或timestamp with time zone	setof timestamp或setof timestamp with time zone(和参数类型相同)	产生一系列值,从start到stop,步长为step

当step为正时,如果start大于stop则返回零行。相反,当step为负时,如果start小于stop则返回零行。对于NULL输入也会返回零行。step为零是一个错误。

案例

SELECT * FROM generate_series(2,4);
 generate_series
-----------------
               2
               3
               4
(3 rows)

SELECT * FROM generate_series(5,1,-2);
 generate_series
-----------------
               5
               3
               1
(3 rows)

SELECT * FROM generate_series(4,3);
 generate_series
-----------------
(0 rows)

SELECT generate_series(1.1, 4, 1.3);
 generate_series 
-----------------
             1.1
             2.4
             3.7
(3 rows)

-- 这个例子依赖于日期+整数操作符
SELECT current_date + s.a AS dates FROM generate_series(0,14,7) AS s(a);
   dates
------------
 2004-02-05
 2004-02-12
 2004-02-19
(3 rows)

SELECT * FROM generate_series('2008-03-01 00:00'::timestamp, '2008-03-04 12:00', '10 hours');
   generate_series   
---------------------
 2008-03-01 00:00:00
 2008-03-01 10:00:00
 2008-03-01 20:00:00
 2008-03-02 06:00:00
 2008-03-02 16:00:00
 2008-03-03 02:00:00
 2008-03-03 12:00:00
 2008-03-03 22:00:00
 2008-03-04 08:00:00
(9 rows)

应用

上个月做了个大屏项目,系统涉及到很多资源各个层级维度的统计,资源存在于很多不同的数据库或者文件,最低计算粒度是按日统计前一天的数据。

跑任务每日任务和图表查询需求拆分实现。项目实现了在线配置数据源和 SQL 任务,支持动态配置更新的数据源/任务调度/任务SQL。(调度周期通过 cron 表达式定义)。

除了mysql/pg/oracle库,项目还有很多 hive 任务,背后基于 MapReduce 实现调度离线文档分析,由于 hive 任务都比较重,执行时间比较长,并发也是有限制的。

一两百个 hive 任务,为避开集中调度高峰,现打散任务调度时间,每隔5分钟执行一个新任务。

今天的主角,Postgres 的序列数据生成函数generate_series(),就可以帮到忙。

# SELECT 60 * 24 = 1440 分钟

SELECT ('0 ' || (generate_series(0, 1440, 5) % 60) || ' ' || (generate_series(0, 1440, 5) / 60) || ' * * ?') AS cron

0 0 0 * * ?
0 5 0 * * ?
0 10 0 * * ?
0 15 0 * * ?
……
0 55 23 * * ?
0 0 24 * * ?  # 此时间不存在,需要剔除

附录

cron 表达式用来定义定时任务的执行策略,表达式字符串由 6 个空格分为 7 个域,每一个域代表一个时间含义。

[] [] [] [] [] [] []
0 */1 * * * ?  # 每隔1分钟执行一次
0 0 22 * * ?  # 每天22点执行一次
0 0 1 1 * ?  # 每月1号凌晨1点执行一次
0 0 23 L * ?  # 每月最后一天23点执行一次
0 0 3 ? * L  # 每周周六凌晨3点实行一次
0 24,30 * * * ?  # 在24分、30分执行一次

http://www.niftyadmin.cn/n/5172619.html

相关文章

律师咨询小程序搭建流程

一、需求分析 在律师咨询小程序的开发过程中,需求分析是至关重要的一步。首先,我们需要明确小程序的定位和目标用户,了解用户的需求和痛点。在此基础上,我们需要细化功能需求,如在线咨询、案件查询、文书生成等。同时…

VB.NET—Bug调试(参数话查询、附近语法错误)

目录 前言: BUG是什么! 事情的经过: 过程: 错误一: 错误二: 总结: 前言: BUG是什么! 在计算机科学中,BUG是指程序中的错误或缺陷,它通过是值代码中的错误、逻辑错误、语法错误、运行时错误等相关问题,这些问题…

C/S架构学习之基于UDP的本地通信(服务器)

基于UDP的本地通信(服务器):创建流程:一、创建数据报式套接字(socket函数): int sock_fd socket(AF_UNIX,SOCK_DGRAM,0);if(-1 sock_fd){perror("socket error");exit(-1);}二、创建…

【java进阶】集合的三种遍历(迭代器、增强for、Lambda)

目录 一、先谈集合: 二、单列集合的三种遍历方式 迭代器遍历 增强for遍历 Lambda表达式遍历 一、先谈集合: 🔥那我们平常用for循环依赖下标遍历不行嘛,这就与集合的分类有关了。 集合的体系结构: collection是单…

【六袆 - Framework】Angular-framework;前端框架Angular发展的由来0001;

Angular发展介绍,Angular17新特性 官方文档Angular框架发展的由来何为结构化、模块化 Angular17新特性 English unit Embarking on the journey of deep technical learning requires a well-structured approach, applicable to any programming language. The key…

【深度挖掘Java性能调优】「底层技术原理体系」深入挖掘和分析如何提升服务的性能以及执行效率(引导篇)

深入挖掘和分析如何提升服务的性能以及执行效率 前提介绍知识要点 性能概述教你看懂程序的性能案例介绍性能指标性能的参考指标性能瓶颈(木桶原理) 性能分析三大定律Amdahl定律计算公式参数解释案例分析定律总结 Gustafson定律与Amdahl定律相对立Gustafs…

在nodejs中验证收到的请求

在nodejs中验证收到的请求 Node.js是构建Web应用程序的一种常用方式。随着应用程序的增长,验证传入的请求变得至关重要,以确保它们格式正确并符合某些标准。在这篇文章中,我们将探索不同的方法来验证接收到的请求,并提供如何在自…

使用 eBPF检测 mmap泄露

目录 背景 官网 malloc泄露检测 mmap泄露检测 调用munmap释放内存 小结 背景 我们知道 mmap系统调用申请的内存空间,属于文件映射区域 和 匿名映射区域。这部分区域并不属于 heap,所以用一般的内存泄露检测工具是检测不出来的。例如:一…