T- Sql 按n小时分组
T- Sql Group by n hours
n小时简单分组可以吗?
我在几分钟内找到了相关问题,但我无法在数小时内完成。
我需要用偏移量按 8 小时对一些数据进行分组。
所以前 8 小时不是 00:00 - 08:00 而是 22:00(昨天) - 06:00(今天)。
我按小时分组并卡住了。
我怎样才能做到这一点?
任何建议表示赞赏。
您可以使用 DATEADD/DATEDIFF 技巧以 8 小时为间隔进行分组。
不过你需要添加一个偏移量,在这种情况下
- 增加 2 小时将 22:30 转移到 00:30。或者 07:30 回到 09:30
- 按 8 小时间隔分组(0-8、8-16、8-24)
- 减去 2 将四舍五入的 00:00 移回 22:00,或将四舍五入的 08:00 移回 06:00
示例脚本
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);
我不知道数据、输入和输出(你应该提供),但这里有一些通用的方法:
假设我们有简单的 table(名为 SimpleTable
),其中包含 2 列:产品销售时间和销售数量:
SellingTime | Quantity
2013-01-02 08:43:22.011 | 4
2013-02-12 12:32:12.001 | 14
etc.
现在,我们将为每个日期添加订购编号:22-6 之间的时间为 1,依此类推。
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
分组并求和 Quantity
:
SELECT NumberOfOrder, SUM(Quantity) FROM (*)
第一个查询代替 *
的位置。
n小时简单分组可以吗? 我在几分钟内找到了相关问题,但我无法在数小时内完成。
我需要用偏移量按 8 小时对一些数据进行分组。
所以前 8 小时不是 00:00 - 08:00 而是 22:00(昨天) - 06:00(今天)。
我按小时分组并卡住了。 我怎样才能做到这一点? 任何建议表示赞赏。
您可以使用 DATEADD/DATEDIFF 技巧以 8 小时为间隔进行分组。
不过你需要添加一个偏移量,在这种情况下
- 增加 2 小时将 22:30 转移到 00:30。或者 07:30 回到 09:30
- 按 8 小时间隔分组(0-8、8-16、8-24)
- 减去 2 将四舍五入的 00:00 移回 22:00,或将四舍五入的 08:00 移回 06:00
示例脚本
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);
我不知道数据、输入和输出(你应该提供),但这里有一些通用的方法:
假设我们有简单的 table(名为 SimpleTable
),其中包含 2 列:产品销售时间和销售数量:
SellingTime | Quantity
2013-01-02 08:43:22.011 | 4
2013-02-12 12:32:12.001 | 14
etc.
现在,我们将为每个日期添加订购编号:22-6 之间的时间为 1,依此类推。
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
分组并求和 Quantity
:
SELECT NumberOfOrder, SUM(Quantity) FROM (*)
第一个查询代替 *
的位置。