You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SQL按小时分组统计后如何实现Hour列的正确排序

如何按时间顺序排序小时统计结果

数据库表结构

dbo.Zaehler表结构及示例数据如下:

ID  gesamtzaehler   gutzaehler  timestamp
1   7119529 7007905 2023-03-01 14:09:15.043
2   7119553 7007929 2023-03-01 14:10:15.013
3   7119577 7007953 2023-03-01 14:11:15.043
4   7119601 7007977 2023-03-01 14:12:15.030
5   7119625 7008001 2023-03-01 14:13:15.047
6   7119649 7008025 2023-03-01 14:14:15.010
7   7119673 7008049 2023-03-01 14:15:15.010
8   7119697 7008073 2023-03-01 14:16:15.027
9   7119721 7008097 2023-03-01 14:17:15.027
10  7119731 7008107 2023-03-01 14:18:15.043
11  7119731 7008107 2023-03-01 14:19:15.057
12  7119731 7008107 2023-03-01 14:20:15.040
13  7119731 7008107 2023-03-01 14:21:15.010

当前统计SQL语句

用于统计每小时内gesamtzaehler与gutzaehler差值的最大波动值(最大值减最小值)的SQL:

SELECT        MAX(gesamtzaehler - gutzaehler) - MIN(gesamtzaehler - gutzaehler) AS Ausschuss, CAST(DATEPART(Hour, timestamp) AS varchar) + ':00' AS Hour
FROM            dbo.Zaehler
WHERE        (timestamp >= DATEADD(hour, - 24, GETDATE()))
GROUP BY DATEPART(hh, timestamp)

当前执行结果

执行上述SQL后得到的结果(未按时间顺序排序):

Ausschuss Hour
12  0:00
13  23:00
6   15:00
14  3:00
3   6:00
11  21:00
63  7:00
4   1:00
14  18:00
19  4:00
25  19:00
7   5:00
0   22:00
5   16:00
15  2:00
29  17:00
4   20:00
2   14:00

问题

由于Hour列是字符串格式,无法按0-24的时间顺序正确排序,需调整SQL实现需求。

解决方案

提供两种可行方案:

方案1:按分组的数值型小时排序

直接在SQL末尾添加ORDER BY DATEPART(hh, timestamp),利用分组时的数值型小时字段排序,无需修改Hour列的格式:

SELECT        MAX(gesamtzaehler - gutzaehler) - MIN(gesamtzaehler - gutzaehler) AS Ausschuss, CAST(DATEPART(Hour, timestamp) AS varchar) + ':00' AS Hour
FROM            dbo.Zaehler
WHERE        (timestamp >= DATEADD(hour, - 24, GETDATE()))
GROUP BY DATEPART(hh, timestamp)
ORDER BY DATEPART(hh, timestamp)

方案2:格式化Hour列为带前导零的字符串,同时按数值排序

如果需要Hour列的字符串格式更规范(如00:00、01:00),可以用RIGHT函数补前导零,此时字符串本身也能按时间顺序排序,同时搭配数值排序确保正确性:

SELECT        MAX(gesamtzaehler - gutzaehler) - MIN(gesamtzaehler - gutzaehler) AS Ausschuss, RIGHT('0' + CAST(DATEPART(Hour, timestamp) AS varchar), 2) + ':00' AS Hour
FROM            dbo.Zaehler
WHERE        (timestamp >= DATEADD(hour, - 24, GETDATE()))
GROUP BY DATEPART(hh, timestamp)
ORDER BY DATEPART(hh, timestamp)

这样Hour列会显示为00:00、01:00...23:00,既满足可视化的格式需求,也能正确排序。


内容的提问来源于stack exchange,提问作者patrik13590

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 17:53:22