求SQL Server中按日统计活跃任务数的T-SQL查询语句
解决方案
在SQL Server中可以通过**递归CTE(公共表表达式)**生成目标日期范围,再关联任务表统计每日活跃任务数,具体实现如下:
假设任务表名为Tasks,执行以下T-SQL语句:
WITH DateRange AS ( -- 初始化:获取表中最早的任务开始日期 SELECT MIN(StartDate) AS [Day] FROM Tasks UNION ALL -- 递归生成后续日期,直到覆盖最晚的任务结束日期 SELECT DATEADD(DAY, 1, [Day]) FROM DateRange WHERE [Day] < (SELECT MAX(EndDate) FROM Tasks) ) -- 统计每日活跃任务数量 SELECT dr.[Day], COUNT(t.Task) AS NumberOfActiveTasks FROM DateRange dr LEFT JOIN Tasks t ON dr.[Day] BETWEEN t.StartDate AND t.EndDate GROUP BY dr.[Day] ORDER BY dr.[Day] OPTION (MAXRECURSION 0); -- 解除递归次数默认限制(默认最多100次)
代码说明:
- 递归CTE生成日期序列:
- 第一部分先获取表中所有任务的最早
StartDate作为起始日期; - 第二部分通过
DATEADD每天递增1,直到日期达到表中最晚的EndDate,生成完整的日期范围。
- 第一部分先获取表中所有任务的最早
- 关联统计活跃任务:
- 使用
LEFT JOIN确保所有日期都被保留(即使当天无活跃任务); - 通过
COUNT(t.Task)统计满足StartDate ≤ 当日日期 ≤ EndDate的任务数(LEFT JOIN未匹配时Task为NULL,COUNT会自动忽略)。
- 使用
- 递归次数限制:
- SQL Server默认递归CTE最多执行100次,若日期范围超过100天,需添加
OPTION (MAXRECURSION 0)取消限制。
- SQL Server默认递归CTE最多执行100次,若日期范围超过100天,需添加
内容的提问来源于stack exchange,提问作者marco birchler
相关产品推荐
相关产品推荐

