【问题标题】:SQL Server GROUP BY Hour over MidnightSQL Server GROUP BY Hour over Midnight
【发布时间】:2019-12-04 18:32:21
【问题描述】:

我在使用跨越午夜的 GROUP BY Hour 时遇到问题。我需要按小时顺序对结果进行排序,但返回的值会在前几天的小时之前列出当前天的“小时”。

示例表:

DATE                LINE_NUMBER TOTAL
2019-12-03 20:38:35     1       150
2019-12-03 20:38:35     2       200
2019-12-03 20:54:35     1       175
2019-12-03 20:54:35     2       210
2019-12-03 23:58:35     1       125
2019-12-03 23:58:35     2       250

2019-12-04 00:52:35     1       155
2019-12-04 00:52:35     2       205
2019-12-04 01:32:35     1       125
2019-12-04 01:32:35     2       275
2019-12-04 01:52:35     1       145
2019-12-04 01:52:35     2       225

当前 SQL 查询:

SELECT sum([TOTAL]) as HOURLY_TOTAL, LINE_NUMBER as LINE_NUMBER  
FROM PRODUCTION_LINES 
WHERE Date > '12/03/2019 15:30:00'
GROUP BY DATEPART(HOUR, [Date]), LINE_NUMBER

当前的 SQL 结果:

HOURLY_TOTAL        LINE_NUMBER
155         1   (Data from current day)
270         1   (Data from current day)
325         1   (Data from previous day)
125         1   (Data from previous day)
205         2   (Data from current day)
500         2   (Data from current day)
410         2   (Data from previous day)
250         2   (Data from previous day)

这是我真正需要的顺序:

HOURLY_TOTAL        LINE_NUMBER
325         1   (Data from previous day)
125         1   (Data from previous day)
410         2   (Data from previous day)
250         2   (Data from previous day)
155         1   (Data from current day)
270         1   (Data from current day)
205         2   (Data from current day)
500         2   (Data from current day)

在网上搜索线索后,看起来其他人的问题比我的要复杂得多,所以我没有看到任何适合我的情况的解决方案。

【问题讨论】:

    标签: sql sql-server sorting group-by sql-order-by


    【解决方案1】:

    你可以ORDER BY一个表达式:

    SELECT sum([TOTAL]) as HOURLY_TOTAL, LINE_NUMBER as LINE_NUMBER  
    FROM PRODUCTION_LINES 
    WHERE Date > '12/03/2019 15:30:00'
    GROUP BY DATEPART(HOUR, [Date]), LINE_NUMBER
    ORDER BY MIN(Date);
    

    实际上,我不太确定是否应该包含 LINE_NUMBER。你可能想要:

    ORDER BY MIN(CONVERT(DATE, Date)), LINE_NUMBER;
    

    【讨论】:

    • 谢谢!该解决方案最终是您的第二个 OrderBy 建议的轻微变化,即: ORDER BY LINE_NUMBER, MIN(CONVERT(DATE, Date));我只需要交换 OrderBY 子句中的 LINE_NUMBER 和 DATE 就可以得到我需要的东西。感谢您的快速建议
    【解决方案2】:

    谢谢!该解决方案最终与您的第二个 OrderBy 建议略有不同,即:

    ORDER BY LINE_NUMBER, MIN(CONVERT(DATE, Date));
    

    我只需要交换 OrderBY 子句中的 LINE_NUMBER 和 DATE 即可获得所需的内容。感谢您的快速建议

    【讨论】:

      猜你喜欢
      • 2011-12-10
      • 1970-01-01
      • 1970-01-01
      • 2011-05-18
      • 2016-07-02
      • 1970-01-01
      • 1970-01-01
      • 2021-11-06
      • 1970-01-01
      相关资源
      最近更新 更多