【问题标题】:T- Sql Group by n hoursT-Sql 按 n 小时分组
【发布时间】:2017-10-12 06:58:59
【问题描述】:

可以按 n 小时简单分组吗? 我在几分钟内找到了相关问题,但我无法在几个小时内完成。

我需要用偏移量将一些数据按 8 小时分组。

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

我按小时分组并卡住了。 我怎样才能做到这一点? 任何建议表示赞赏。

【问题讨论】:

    标签: sql-server tsql datetime group-by offset


    【解决方案1】:

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

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

    • 将 22:30 到 00:30 的班次增加 2 小时。或者 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);
    

    【讨论】:

    • 非常感谢您的帮助
    【解决方案2】:

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

    假设我们有一个简单的表(名为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 (*)
    

    * 的位置放置第一个查询。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-05-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多