PostgreSQL数据库以任意时间间隔聚合查询group by

这篇具有很好参考价值的文章主要介绍了PostgreSQL数据库以任意时间间隔聚合查询group by。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

业务场景

  • 我们做的是智慧交通信控平台,需要将实时采集到的交通大数据(信号机灯态、卡口过车、雷达数据等)全部入库,按照时间顺序存储
  • 然后根据原始数据,再计算出一些交通评价指标,存储到数据库,供后续聚合查询和分析统计
  • 前端设备(信号机、雷达、卡口等)上报原始数据,按照各自定义好的数据格式,使用socket上报给服务端
  • 我们使用的编程语言是Java,所以服务端使用netty接收
  • 实时接收的数据,经过kafka批量发送到采集服务,进行数据融合处理,批量写入clickhouse数据库
  • 根据clickhouse里的原始数据,按照信控周期(相位或周期)或者固定时间(5分钟),计算出数据指标,再存储PostgreSQL数据库
  • 服务端展示时,一部分查询已有数据指标列表,一部分要按照不同时间粒度再对数据指标进行聚合展示
  • 我们业务数据库用的是PostgreSQL,目前使用的版本为14.2

以固定时间(年/月/日/时/分/秒)聚合

  • 第一种聚合需求,按照固定时间聚合,例如我们展示时,其中2个聚合粒度为:小时
    PostgreSQL数据库以任意时间间隔聚合查询group by
  • 对于日期,我们可以存储时间戳、毫秒数、字符串等,处理时再根据相应类型转换下即可
  • 日期时间一般是 年、月、日、时、分、秒,这六种都可以直接取到,所以精确到这些粒度都比较简单

to_char聚合

  • 下面给出一个使用to_char函数的实现,其实主要就是做下字符串截取
  • 注意,函数里需要标注参数类型,使用::DATE标注
to_char(date::DATE, 'YYYY') as year
to_char(date::DATE, 'YYYY-MM') as month
to_char(date::DATE, 'YYYY-MM-DD') as day
to_char(date::DATE, 'YYYY-MM-DD  HH24') as hour
to_char(date::DATE, 'YYYY-MM-DD  HH24:MI ') as minute
to_char(date::DATE, 'YYYY-MM-DD  HH24:MI:SS ') as second

date_trunc聚合

  • 使用date_trunc也可以做到上面的效果,还可以加上不同时区
SELECT date_trunc('hour', TIMESTAMP '2001-02-16 20:38:40');
Result: 2001-02-16 20:00:00
SELECT date_trunc('year', TIMESTAMP '2001-02-16 20:38:40');
Result: 2001-01-01 00:00:00
SELECT date_trunc('day', TIMESTAMP WITH TIME ZONE '2001-02-16
 20:38:40+00');
Result: 2001-02-16 00:00:00-05
SELECT date_trunc('day', TIMESTAMP WITH TIME ZONE '2001-02-16
 20:38:40+00', 'Australia/Sydney');
Result: 2001-02-16 08:00:00-05
SELECT date_trunc('hour', INTERVAL '3 days 02:47:33');
Result: 3 days 02:00:00

以任意时间聚合

  • 第二种需求,就是按照一定时间粒度聚合,例如我们的其中两种聚合粒度为:5分钟15分钟
  • 对于以任意时间聚合,就比较麻烦了,还需要数学计算,SQL写起来会特别长
  • 这个问题在PostgreSQL14之后得到解决,因为这个版本增加了一个新函数支持date_bin
  • 官方文档描述为:The function date_bin “bins” the input timestamp into the specified interval (the stride) aligned with a specified origin.
  • 渣翻一下为函数date_bin将输入时间戳“存储”到与指定原点对齐的指定间隔(步长)中。
  • 有了这个函数后,我们可以很方便的根据任意时间间隔聚合
  • 对齐时间可以根据你的需要写,如果都是今年的新数据,你写2023-01-01都没问题

date_bin聚合

  • 下面给出几个示例
SELECT date_bin('15 minutes', TIMESTAMP '2020-02-11 15:44:17',
 TIMESTAMP '2001-01-01');
Result: 2020-02-11 15:30:00
SELECT date_bin('15 minutes', TIMESTAMP '2020-02-11 15:44:17',
 TIMESTAMP '2001-01-01 00:02:30');
Result: 2020-02-11 15:32:30

实际应用示例

  • 根据我们的业务场景,按照15分钟聚合
  • 其实时间间隔15 minutes,是作为参数传递进去的,其他时间间隔也都可以实现
  • 给一个官方文档地址:PostgreSQL14
SELECT
	intersection_id,
	approach,
	date_bin ( '15 minutes', time_stamp, TIMESTAMP '2023-01-01' ) AS time_stamp2,
	SUM ( traffic_flow ) AS traffic_flow,
	round( AVG ( congestion_index ) :: NUMERIC, 2 ) AS congestion_index,
	round( AVG ( saturation ) :: NUMERIC, 2 ) AS saturation,
	round( AVG ( queue_length ) :: NUMERIC, 2 ) AS queue_length,
	round( AVG ( delay ) :: NUMERIC, 2 ) AS delay 
FROM
	situation_analysis_intersection 
WHERE
	intersection_id = 1687005 
	and approach = 'WB'
	AND time_stamp >= '2023-04-20 00:00:00' 
	AND time_stamp < '2023-04-29 00:00:00' 
GROUP BY
	time_stamp2,
	intersection_id,
	approach 
ORDER BY
	time_stamp2 
	LIMIT 20 OFFSET 0
  • 其中date_bin ( '15 minutes', time_stamp, TIMESTAMP '2023-01-01' ) AS time_stamp2 就是把时间戳time_stamp处理下,按照15分钟对齐后作为time_stamp2
  • 下面的GROUP BY time_stamp2,就是再根据对齐后的time_stamp2进行分组聚合统计,完美符合需求

文章来源地址https://www.toymoban.com/news/detail-432529.html

到了这里,关于PostgreSQL数据库以任意时间间隔聚合查询group by的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • postgresql|数据库|MySQL数据库向postgresql数据库迁移的工具pgloader的部署和初步使用

    postgresql|数据库|MySQL数据库向postgresql数据库迁移的工具pgloader的部署和初步使用

    MySQL数据库和postgresql数据库之间的差异并不多,这里的差异指的是对SQL语言的支持两者并不大,但底层的东西差异是非常多的,例如,MySQL的innodb引擎概念,数据库用户管理,这些和postgresql相比是完全不同的(MySQL用户就是用户,没有角色,postgresql有用户,有角色,但差异不

    2024年02月14日
    浏览(13)
  • MySQL数据库,聚合查询

    MySQL数据库,聚合查询

    目录 1、聚合查询 1.1聚合函数 1.1.1count函数 1.1.2sum函数 1.1.3avg函数 1.1.4max函数 1.1.5min函数 1.2group by子句 1.3having 聚合函数查询又叫函数查询,它是通过一些特定的函数根据需求来查询相关的信息,常见的聚合函数为: COUNT - 求总数,不包含某字段为null值 SUM - 求和,不包含某字

    2023年04月21日
    浏览(13)
  • 【MySql】数据库的聚合查询

    【MySql】数据库的聚合查询

    写在最前面的话         哈喽,宝子们,今天给大家带来的是MySql数据库的聚合查询。在前面CRUD章节我们学习了表达式查询,表达式查询是针对列和列之间进行运算的,那么如果想在行和行之间进行运算,那么就需要用到聚合查询。 聚合查询除了包含聚合函数外(count,

    2024年02月09日
    浏览(10)
  • 允许任意IP访问mysql数据库

    问题描述 MYSQL默认只能本地连接,即127.0.0.1和localhost,其他主机IP无法访问数据库,否则会出现如下报错信息: Host is not allowed to connect to this MySQL server 一、先在本地用localhost用户登录MYSQL 二、查询用户表 三、、设置允许任意IP访问,执行语句: 四、刷新权限 五、在其他主机

    2024年02月11日
    浏览(11)
  • postgresql数据库定时备份到远程数据库

    postgresql数据库定时备份到远程数据库

    1.老规矩,服务器目录结构: conf目录无内容 profile: 其中: 最后一行 export PGPASSWORD=‘root’ 是需要备份的数据库的密码,因为直接用 pg_dump 命令备份需要输入密码交互,而我们需要达到自动备份,所以借助这种方式不需要输入密码 docker-compose.yml: 启动容器: 然后再data目录下面

    2024年02月09日
    浏览(11)
  • 【数据库】什么是 PostgreSQL?开源数据库系统

    【数据库】什么是 PostgreSQL?开源数据库系统

    PostgreSQL 是一个开源的对象关系数据库系统,本文,我们将讨论 PostgreSQL、它的用途和好处。 PostgreSQL 是由 PostgreSQL Global Development Group 开发的高级 开源关系数据库管理系统(RDBMS) 。它作为 POSTGRES 项目的一部分于 1986 年在加州大学伯克利分校启动,它最初于 1996 年 7 月 8 日发布

    2023年04月08日
    浏览(12)
  • PostgreSQL Linux操作PostgreSQL数据库

    PostgreSQL教程 菜鸟教程:https://www.runoob.com/postgresql/postgresql-tutorial.html 登录PG数据库:psql -U 用户名(U需要大写) 登录PG数据库(指定主机、端口,并进入指定数据库): psql -U 用户名 -h 127.0.0.1 -p 5432 -d 数据库名 -U 登录的用户名 -h 连接的主机(默认127.0.0.1,可替换成远程主机

    2024年02月11日
    浏览(10)
  • 探索存证、溯源类数据库最优解,聚合数据区块链数据库AnchorDB发布

    探索存证、溯源类数据库最优解,聚合数据区块链数据库AnchorDB发布

    近日,聚合数据区块链数据库AnchorDB 正式对外发布,这是企业对于数字化技术应用的又一次探索,产品的发布,将为存证、溯源类场景提供更高效、易用的数据库解决方案,并且进一步丰富聚合数据的数字化产品矩阵。 作为一款具有区块链不可篡改特性的轻量级存证数据库,

    2024年02月11日
    浏览(12)
  • [运维|数据库] docker postgresql数据库环境变量配置

    要配置Docker中的PostgreSQL数据库的环境变量,可以使用以下方法: 使用Docker命令行: 将 用户名 , 密码 , 数据库名 替换为你想要设置的实际值。这将创建一个名为 mypostgres 的容器,并将 PostgreSQL 的用户名、密码和数据库名设置为指定的值。 -p 5432:5432 指定了容器内部和主机之间

    2024年02月09日
    浏览(19)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包