使用SQL Server查询按小时间隔汇总值

时间:2019-11-20 10:57:38

标签: sql sql-server tsql

我在表中有以下测试数据

ID  TEST_DATE          Value
1   10/21/2019 0:00     10
1   10/21/2019 0:15     10
1   10/21/2019 0:30     10
1   10/21/2019 0:45     10
1   10/21/2019 1:00     20
1   10/21/2019 1:15     10
1   10/21/2019 1:30     10
1   10/21/2019 1:45     10
1   10/21/2019 2:00     30

我在下面的SQL查询中编写了按小时间隔汇总值的方法

SELECT ID, dateadd(hour, datediff(hour, 0, TEST_DATE), 0) as ACTUAL_DATE,SUM(VALUE) as ACTUAL_VALUE 
FROM TEST_TABLE
GROUP BY dateadd(hour, datediff(hour, 0, TEST_DATE), 0) ,ID

当前获得的结果为

ID   ACTUAL_DATE       ACTUAL_VALUE
1    10/21/2019 0:00    40
1    10/21/2019 1:00    50

如果我希望每小时的汇总从15分钟而不是0分钟开始考虑,那么我的SQL查询应该是什么。

像第一个小时一样应该汇总

2019-10-21 00:15:00 - 10
2019-10-21 00:30:00 - 10
2019-10-21 00:45:00 - 10
2019-10-21 01:00:00 - 20

结果应类似于

ID   ACTUAL_DATE       ACTUAL_VALUE
1    10/21/2019 0:00    50
1    10/21/2019 1:00    60

2 个答案:

答案 0 :(得分:1)

减去15分钟:

SELECT t.ID, v.ACTUAL_DATE, SUM(t.VALUE) as ACTUAL_VALUE 
FROM TEST_TABLE T CROSS APPLY
     (VALUES (DATEADD(HOUR,
                      DATEDIFF(HOUR, 0, DATEADD(MINUTE, -15, t.TEST_DATE)),
                      0
                     )
             )
     ) v(ACTUAL_DATE)
GROUP BY t.ID, v.ACTUAL_DATE;

答案 1 :(得分:1)

以下表达式会将2019-10-21 00:152019-10-21 00:302019-10-21 00:452019-10-21 01:00之类的日期映射到2019-10-21 00:15

SELECT DATEADD(MINUTE, (DATEDIFF(MINUTE, 0, TEST_DATE) - 15) / 60 * 60 + 15, 0) AS ACTUAL_DATE

在您的GROUP BY中使用此表达式。