【发布时间】:2017-10-12 06:58:59
【问题描述】:
可以按 n 小时简单分组吗? 我在几分钟内找到了相关问题,但我无法在几个小时内完成。
我需要用偏移量将一些数据按 8 小时分组。
所以前 8 小时不是 00:00 - 08:00,而是 22:00(昨天) - 06:00(今天)。
我按小时分组并卡住了。 我怎样才能做到这一点? 任何建议表示赞赏。
【问题讨论】:
标签: sql-server tsql datetime group-by offset
可以按 n 小时简单分组吗? 我在几分钟内找到了相关问题,但我无法在几个小时内完成。
我需要用偏移量将一些数据按 8 小时分组。
所以前 8 小时不是 00:00 - 08:00,而是 22:00(昨天) - 06:00(今天)。
我按小时分组并卡住了。 我怎样才能做到这一点? 任何建议表示赞赏。
【问题讨论】:
标签: sql-server tsql datetime group-by offset
您可以使用 DATEADD/DATEDIFF 技巧按 8 小时间隔分组。
在这种情况下,您需要添加偏移量
示例脚本
DECLARE @foo table (foo smalldatetime, bar int);
INSERT @foo (foo, bar)
VALUES
('2017-10-11 21:00', 1),
('2017-10-11 22:00', 2),
('2017-10-11 23:00', 3),
('2017-10-12 01:00', 4),
('2017-10-12 03:00', 5),
('2017-10-12 05:00', 6),
('2017-10-12 07:00', 7),
('2017-10-12 08:00', 8);
SELECT
SUM(bar),
DATEADD(hh, ((DATEDIFF(hh, 0, foo)+2)/8*8)-2, 0)
FROM
@foo
GROUP BY
DATEADD(hh, ((DATEDIFF(hh, 0, foo)+2)/8*8)-2, 0);
【讨论】:
我不知道数据、输入和输出(您应该提供),但这里有一些通用方法:
假设我们有一个简单的表(名为SimpleTable),有两列:销售产品的时间和销售的数量:
SellingTime | Quantity
2013-01-02 08:43:22.011 | 4
2013-02-12 12:32:12.001 | 14
etc.
现在,我们将为每个日期添加订购号:1 表示 22-6 等之间的时间。
SELECT SellingTime, Qunatity,
CASE WHEN DATEPART(hh, SellingTime) >= 22 AND DATEPART(hh, SellingTime) < 6 THEN 1
WHEN DATEPART(hh, SellingTime) >= 6 AND DATEPART(hh, SellingTime) < 14 THEN 2
ELSE 3 END AS NumberOfOrder
FROM SimpleTable
现在,您需要做的就是按NumberOfOrder 和 sum Quantity 分组:
SELECT NumberOfOrder, SUM(Quantity) FROM (*)
在* 的位置放置第一个查询。
【讨论】: