如何在SQL中按周一至周五每小时维度聚合统计请求数量
问题原因
原有语句使用DATENAME(WEEK, CreatedOn)(同DATENAME(WK, CreatedOn))获取的是日期属于当年的第几周,因此分组逻辑是按不同周次拆分统计,无法跨周聚合同一星期几的同时段数据。
调整后SQL(兼容原有SQL Server语法)
-- 如需强制返回中文星期名称,可先执行以下语句: SET LANGUAGE '简体中文' SELECT DATENAME(WEEKDAY, CreatedOn) AS 星期几, DATEPART(HOUR, CreatedOn) AS 小时, COUNT(*) AS 对应请求数 FROM [Enterprise32].[dbo].[nav_EmailEstimateRequests] WHERE CreatedOn > '2021-01-01' -- 筛选周一到周五(SQL Server默认周日为1、周六为7,2-6对应周一到周五) AND DATEPART(WEEKDAY, CreatedOn) BETWEEN 2 AND 6 GROUP BY DATENAME(WEEKDAY, CreatedOn), DATEPART(HOUR, CreatedOn), DATEPART(WEEKDAY, CreatedOn) -- 按星期顺序、小时顺序排序,输出更符合阅读习惯 ORDER BY DATEPART(WEEKDAY, CreatedOn), DATEPART(HOUR, CreatedOn);
核心改动说明
- 把原周次获取逻辑替换为
DATENAME(WEEKDAY, CreatedOn),直接获取日期对应的星期几名称,实现跨周同星期几的聚合 - 新增工作日过滤条件,自动筛除周六周日的数据,符合需求限定的统计范围
- 分组字段调整为「星期几+小时」,所有跨周的同一星期几同时段数据会合并统计
- 排序逻辑调整为按星期几的数字顺序、小时顺序排序,避免输出结果顺序混乱
内容的提问来源于stack exchange,提问作者Parth Kadakia
相关产品推荐
相关产品推荐

