如何按每3天对数据表的datetime与value字段进行聚合?
按每3天聚合时间序列数据的实现方案
原始数据表
| datetime | value |
|---|---|
| 2022-10-21 11:23:00 | 1 |
| 2022-10-22 12:12:00 | 2 |
| 2022-10-23 13:43:00 | 0 |
| 2022-10-24 14:01:00 | 5 |
| 2022-10-25 10:23:00 | 2 |
期望聚合结果
| datetime | value |
|---|---|
| 2022-10-21 - 2022-10-23 | 3 |
| 2022-10-24 - 2022-10-25 | 7 |
实现思路
核心就是给每条数据分配一个分组ID,让每连续3天的记录归为同一组,最后按这个ID聚合计算总和,再拼接时间范围即可。
MySQL 实现代码
SELECT CONCAT(MIN(DATE(datetime)), ' - ', MAX(DATE(datetime))) AS datetime, SUM(value) AS value FROM ( SELECT datetime, value, -- 以表中最早日期为基准,每3天划一个分组 FLOOR(DATEDIFF(DATE(datetime), (SELECT MIN(DATE(datetime)) FROM your_table)) / 3) AS group_id FROM your_table ) AS grouped_data GROUP BY group_id ORDER BY group_id;
PostgreSQL 实现代码
SELECT CONCAT(MIN(DATE(datetime)), ' - ', MAX(DATE(datetime))) AS datetime, SUM(value) AS value FROM ( SELECT datetime, value, -- 以表中最早日期为基准,每3天划一个分组 FLOOR((DATE(datetime) - (SELECT MIN(DATE(datetime)) FROM your_table)) / INTERVAL '3 days') AS group_id FROM your_table ) AS grouped_data GROUP BY group_id ORDER BY group_id;
注意事项
- 子查询里的分组ID默认以表中最早日期为起点,若想从指定日期开始分组,直接把
MIN(DATE(datetime))替换成目标起始日期即可 - 用
DATE(datetime)是忽略时分秒仅按日期分组,若需保留时间精度,可去掉DATE()函数并调整日期差的计算逻辑
内容的提问来源于stack exchange,提问作者elektruver
相关产品推荐
相关产品推荐

