我在表中有以下测试数据
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
答案 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:15
,2019-10-21 00:30
,2019-10-21 00:45
和2019-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
中使用此表达式。