如何用SQL/PLSQL将非午夜起始的5分钟间隔合并为15分钟并求和
如何用SQL/PLSQL将非午夜起始的5分钟间隔数据合并为15分钟间隔并求和
需求说明
需要将起始时间为非午夜(如00:05、00:20、00:35、00:50)的5分钟时间间隔数据,每3个连续的5分钟合并为15分钟间隔,并对对应数值求和,最终结果以15分钟间隔的结束时间作为分组标识。
示例输入数据
| 时间间隔 | 数值 |
|---|---|
| 00:05 | 2 |
| 00:10 | 3 |
| 00:15 | 7 |
| 00:20 | 1 |
| 00:25 | 7 |
| 00:30 | 8 |
| 00:35 | 9 |
| 00:40 | 10 |
| 00:45 | 3 |
| 00:50 | 1 |
| 00:55 | 2 |
| 00:00 | 3 |
期望输出结果
| 时间间隔 | 求和值 |
|---|---|
| 00:15 | 12 |
| 00:30 | 16 |
| 00:45 | 22 |
| 00:00 | 6 |
SQL实现方案
假设条件
假设数据表名为 interval_data,其中:
interval_time:时间间隔字段(类型为DATE,若为字符串需先转换)数值:待求和的数值字段
核心SQL语句
SELECT TO_CHAR(group_end_time, 'HH24:MI') AS "时间间隔", SUM(数值) AS "求和值" FROM ( SELECT interval_time, 数值, -- 计算当前时间所属的15分钟组结束时间 TRUNC(interval_time, 'HH24') + NUMTODSINTERVAL( FLOOR( (EXTRACT(MINUTE FROM interval_time) + 10) / 15 ) * 15, 'MINUTE' ) AS group_end_time FROM interval_data ) t GROUP BY group_end_time ORDER BY group_end_time;
逻辑解释
内层子查询:
TRUNC(interval_time, 'HH24'):提取当前时间的整点小时部分(如00:05会转为00:00)EXTRACT(MINUTE FROM interval_time):获取时间的分钟数(分钟数 + 10) / 15:通过偏移10分钟调整分组逻辑,让00:05-00:15的分钟数都归到15分钟组,00:20-00:30归到30分钟组,以此类推FLOOR(...) *15:计算出当前组对应的结束分钟数,再通过NUMTODSINTERVAL转为时间间隔,加到整点时间上得到组结束时间
外层查询:
- 按组结束时间分组,对数值求和
- 用
TO_CHAR将时间格式化为HH24:MI的字符串输出
适配字符串类型时间字段
如果interval_time是字符串类型(如VARCHAR2),需要先转换为DATE类型,SQL语句调整为:
SELECT TO_CHAR(group_end_time, 'HH24:MI') AS "时间间隔", SUM(数值) AS "求和值" FROM ( SELECT TO_DATE(interval_time, 'HH24:MI') AS interval_time, 数值, TRUNC(TO_DATE(interval_time, 'HH24:MI'), 'HH24') + NUMTODSINTERVAL( FLOOR( (EXTRACT(MINUTE FROM TO_DATE(interval_time, 'HH24:MI')) + 10) / 15 ) * 15, 'MINUTE' ) AS group_end_time FROM interval_data ) t GROUP BY group_end_time ORDER BY group_end_time;
内容的提问来源于stack exchange,提问作者tabing16
相关产品推荐
相关产品推荐

