代码之家  ›  专栏  ›  技术社区  ›  Bogu

T-Sql按n小时分组

  •  1
  • Bogu  · 技术社区  · 7 年前

    可以按n小时进行简单分组吗? 我在几分钟内找到了相关的问题,但我用不了几个小时。

    所以前8个小时不是00:00-08:00,而是22:00(昨天)-06:00(今天)。

    我按小时将其分组,然后卡住了。 我该怎么做? 如有任何建议,不胜感激。

    2 回复  |  直到 7 年前
        1
  •  2
  •   gbn    7 年前

    您可以使用DATEADD/DATEDIFF技巧按8小时的间隔进行分组。

    在这种情况下,您需要添加偏移量

    • 按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);
    
        2
  •  0
  •   Michał Turczyn    7 年前

    我不知道数据、输入和输出(您应该提供),但这里有一些一般的方法:

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

    * 您将第一个查询放在首位。