根据活动开始和持续时间计算活动项目的时间段

时间:2013-03-19 19:27:14

标签: sql-server sql-server-2005 count

我正在使用MS SQL Server 2005并遇到以下问题。我有一个电话记录日志,需要分析一段时间内的线路利用率。我将通过省略细节并仅询问我遇到的问题来尝试简化任务。 假设通过列将呼叫记录到表中:呼叫开始的日期和时间,以分钟为单位的呼叫持续时间以及使用的行#。我需要计算,每个特定时刻(每分钟)有多少行忙。实际上,我最后会通过做一些聚合来使用更长的时间段(15分钟,半小时等),但我对此没有任何问题。

因此,示例源表(3行)可以包含以下内容:

StartDateTime, Duration, LineNr
2013-01-01 10:00:00, 5, 1
2013-01-01 10:01:00, 6, 2
2013-01-01 10:03:00, 3, 3
2013-01-01 10:08:00, 2, 1
2013-01-01 10:09:00, 3, 2
2013-01-01 10:11:00, 1, 1

要从查询返回的结果表应如下:

Period, BusyLineCount
...
2013-01-01 09:58:00, 0
2013-01-01 09:59:00, 0
2013-01-01 10:00:00, 1
2013-01-01 10:01:00, 2
2013-01-01 10:02:00, 2
2013-01-01 10:03:00, 3
2013-01-01 10:04:00, 3
2013-01-01 10:05:00, 2
2013-01-01 10:06:00, 1
2013-01-01 10:07:00, 0
2013-01-01 10:08:00, 1
2013-01-01 10:09:00, 2
2013-01-01 10:10:00, 1
2013-01-01 10:11:00, 2
2013-01-01 10:12:00, 0
2013-01-01 10:13:00, 0
...

我该如何做到这一点?

P.S。这是我在这里发布的第一个问题,英语不是我的母语,所以请不要介意我做错了什么。在此先感谢您的帮助。

1 个答案:

答案 0 :(得分:3)

这是一种使用递归CTE的方法。这可能会在很短的时间内表现良好,但您需要使用较大的那些进行测试。

DECLARE @Start DATETIME, @End DATETIME
SET @Start = '20130101 09:58:00'
SET @End = '20130101 10:15:00'

;WITH TimePeriods AS
(
    SELECT @Start Period
    UNION ALL
    SELECT DATEADD(MINUTE,1,Period)
    FROM TimePeriods
    WHERE DATEADD(MINUTE,1,Period) <= @End
), LineUsage AS (
    SELECT StartDateTime, Duration, LineNr
    FROM YourTable
    UNION ALL
    SELECT DATEADD(MINUTE,1,StartDateTime), Duration-1, LineNr
    FROM LineUsage
    WHERE Duration-1 > 0
)
SELECT A.Period, COUNT(DISTINCT B.LineNr) BusyLineCount
FROM TimePeriods A
LEFT JOIN LineUsage B
  ON A.Period = B.StartDateTime
GROUP BY A.Period
ORDER BY A.Period
OPTION(MAXRECURSION 0)

Here is a sql fiddle ,附带现场演示。