您如何在 SQL Server 中计算每天计划中的任务数?
Posted
技术标签:
【中文标题】您如何在 SQL Server 中计算每天计划中的任务数?【英文标题】:How do you count number tasks in schedule per day in SQL Server? 【发布时间】:2016-10-22 17:25:12 【问题描述】:我正在尝试在 SQL Server 中创建一个查询,该查询将返回每天的任务数。如果任务的开始日期和完成日期在同一天,那么它应该只在计数中加一。
这是一个小的示例数据集:
+----+------------+-------------+
| ID | Start_Date | Finish_Date |
+----+------------+-------------+
| 1 | 24-Oct-16 | 24-Oct-16 |
| 2 | 24-Oct-16 | 26-Oct-16 |
| 3 | 25-Oct-16 | 26-Oct-16 |
| 4 | 26-Oct-16 | 27-Oct-16 |
| 5 | 26-Oct-16 | 28-Oct-16 |
+----+------------+-------------+
这是预期的结果:
+-----------+----------------+
| Date | Count_Of_Tasks |
+-----------+----------------+
| 24-Oct-16 | 2 |
| 25-Oct-16 | 2 |
| 26-Oct-16 | 4 |
| 27-Oct-16 | 2 |
| 28-Oct-16 | 1 |
+-----------+----------------+
任何人都可以创建一个示例查询来计算每天的任务数吗?
感谢您的帮助!
【问题讨论】:
【参考方案1】:您需要一个calendar
表来执行此操作
我使用Recursive CTE
即时生成开始和结束日期范围之间的日期。但最好在数据库中创建一个Calendar
表。在这样的查询中会很有帮助
;with data as
(
select * from (
VALUES
(1, '2016-10-24 00:00:00', '2016-10-24 00:00:00'),
(2, '2016-10-24 00:00:00', '2016-10-26 00:00:00'),
(3, '2016-10-25 00:00:00', '2016-10-26 00:00:00'),
(4, '2016-10-26 00:00:00', '2016-10-27 00:00:00'),
(5, '2016-10-26 00:00:00', '2016-10-28 00:00:00')) tc ([ID], [Start_Date], [Finish_Date])
),calendar
AS (SELECT dates = CONVERT(DATETIME, '24-Oct-16') -- Min Start_Date
UNION ALL
SELECT dates = Dateadd(DAY, 1, dates)
FROM calendar
WHERE dates < '28-Oct-16') -- Max Finish_Date
SELECT c.dates,
Count(s.Start_Date) AS Count_Of_Tasks
FROM calendar c
LEFT JOIN data s
ON c.dates between s.Start_Date and s.Finish_Date
Group by c.dates
结果:
╔═════════════════════════╦════════════════╗
║ dates ║ Count_Of_Tasks ║
╠═════════════════════════╬════════════════╣
║ 2016-10-24 00:00:00.000 ║ 2 ║
║ 2016-10-25 00:00:00.000 ║ 2 ║
║ 2016-10-26 00:00:00.000 ║ 4 ║
║ 2016-10-27 00:00:00.000 ║ 2 ║
║ 2016-10-28 00:00:00.000 ║ 1 ║
╚═════════════════════════╩════════════════╝
【讨论】:
效果很好,非常感谢!附带说明一下,由于我的数据集有多大,我必须在查询末尾添加 OPTION (maxrecursion 0)。它一直给出错误,“在语句完成之前,最大递归 100 已用完”。 @user3174038 - 是的..如果开始日期和结束日期之间的差距很大,您必须添加OPTION (maxrecursion 0)
【参考方案2】:
这很棘手。一种方法是分解数据并使用运行总和重新聚合:
select dte,
sum(sum(inc)) over (order by dte) as total
from ((select start_date as dte, 1 as inc
from example
) union all
(select dateadd(day, 1, finish_date), -1 as inc
from example
)
) e
group by dte
【讨论】:
【参考方案3】:SELECT DISTINCT(startdate),
(
SELECT COUNT(*)
FROM tasks AS b
WHERE a.startdate BETWEEN b.startdate AND b.enddate
)
FROM tasks AS a
UNION
SELECT DISTINCT(enddate),
(
SELECT COUNT(*)
FROM tasks AS b
WHERE a.enddate BETWEEN b.startdate AND b.enddate
)
FROM tasks AS a
【讨论】:
以上是关于您如何在 SQL Server 中计算每天计划中的任务数?的主要内容,如果未能解决你的问题,请参考以下文章
如何从事件日志表计算 SQL Server 中的平均队列长度
SQL Server备份恢复维护计划实现备份:每周数据库完整备份每天差异备份每小时日志备份
如何在 SQL Server 中的滑动窗口上聚合(计算不同的项目)?