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 (*)

第一个查询代替 * 的位置。