SQL Server中将15分钟间隔数据按小时粒度聚合的实现方法问询
问题背景
现有SQL Server中存储15分钟间隔销售数据的数据表,表结构及示例数据如下:
StartDate Start End Sales ============================================== 2020-08-25 00:00:00 00:15:00 291.4200 2020-08-25 00:15:00 00:30:00 401.1700 2020-08-25 00:30:00 00:45:00 308.3300 2020-08-25 00:45:00 01:00:00 518.3200 2020-08-25 01:00:00 01:15:00 247.3700 2020-08-25 01:15:00 01:30:00 115.4700 2020-08-25 01:30:00 01:45:00 342.3800 2020-08-25 01:45:00 02:00:00 233.0900 2020-08-25 02:00:00 02:15:00 303.3400 2020-08-25 02:15:00 02:30:00 11.9000 2020-08-25 02:30:00 02:45:00 115.2400 2020-08-25 02:45:00 03:00:00 199.5200 2020-08-25 06:00:00 06:15:00 0.0000 2020-08-25 06:15:00 06:30:00 45.2400 2020-08-25 06:30:00 06:45:00 30.4800 2020-08-25 06:45:00 07:00:00 0.0000 2020-08-25 07:00:00 07:15:00 0.0000 2020-08-25 07:15:00 07:30:00 69.2800
需求为基于表中的Start、End时间列,将15分钟间隔的数据集分组为1小时时间间隔的聚合数据。
实现方案
完全可以实现,核心逻辑是将属于同一日期、同一整小时的15分钟数据划分为一组,对销售额做求和聚合,同时生成对应小时区间的起止时间即可。
具体SQL实现(SQL Server语法)
SELECT StartDate, -- 生成小时区间的开始时间(整小时) DATEADD(HOUR, DATEPART(HOUR, [Start]), CAST(StartDate AS DATETIME)) AS HourStart, -- 生成小时区间的结束时间(开始时间加1小时) DATEADD(HOUR, 1, DATEADD(HOUR, DATEPART(HOUR, [Start]), CAST(StartDate AS DATETIME))) AS HourEnd, -- 聚合该小时内的总销售额 SUM(Sales) AS TotalSales FROM 你的表名 -- 替换为实际业务表名 GROUP BY StartDate, DATEPART(HOUR, [Start]) -- 按日期+小时维度分组 ORDER BY StartDate, HourStart
效果说明
以上述示例数据为例,聚合后0点整小时(00:00:00~01:00:00)的总销售额为291.42+401.17+308.33+518.32=1519.24,和实际计算结果一致。如果某小时内缺少部分15分钟区间的数据(比如示例中3点到6点无数据),聚合结果中不会自动生成该小时的记录,如需补全缺失的小时区间,可以额外关联小时维度表实现。
内容的提问来源于stack exchange,提问作者Mohd
相关产品推荐
相关产品推荐

