如何在SQL中统计2024年工单对应的过去30天历史工单数量?
按日期范围统计客户过去30天工单数量的SQL方案
你当前用ROW_NUMBER()得到的是客户2024年所有工单的倒序行号,而非过去30天的数量。要实现按日期范围限制统计,需要用带窗口框架的COUNT()聚合窗口函数,核心是在窗口中指定日期范围而非仅排序。
修改后的SQL语句
SELECT customer_id, ticket_number, receive_dt, COUNT(ticket_number) OVER ( PARTITION BY customer_id ORDER BY receive_dt RANGE BETWEEN INTERVAL '30 days' PRECEDING AND CURRENT ROW ) AS "Num Tickets Last 30 Days" FROM tickets WHERE EXTRACT(YEAR FROM receive_dt) = 2024
关键说明
- 替换
ROW_NUMBER()为COUNT():ROW_NUMBER()仅生成行号,COUNT()会统计窗口内的工单总数,符合你要的数量统计需求。 - 窗口框架限定日期范围:
RANGE BETWEEN INTERVAL '30 days' PRECEDING AND CURRENT ROW会将统计范围锁定在当前工单的receive_dt往前30天内,确保只计算该时间区间内的同一客户工单。 - 保留分组与排序:
PARTITION BY customer_id确保统计仅针对当前客户,ORDER BY receive_dt保证窗口按时间顺序计算,避免跨时间范围的错误统计。
数据库语法差异提示
不同数据库对日期区间的写法略有不同:
- MySQL/MariaDB(8.0.22+):支持与上面相同的语法,也可写为
RANGE BETWEEN INTERVAL 30 DAY PRECEDING AND CURRENT ROW - SQL Server:需用
RANGE BETWEEN DATEADD(day, -30, receive_dt) AND CURRENT ROW - Oracle:使用
RANGE BETWEEN NUMTODSINTERVAL(30, 'day') PRECEDING AND CURRENT ROW
内容的提问来源于stack exchange,提问作者Joshua Pelton-Stroud
相关产品推荐
相关产品推荐

