我最近從SO上拉了一些代碼,試圖解決'孤島和空白'問題,並且算法可以幫助你解決你的問題。
的想法是,要找到具有最開始的過程,就像在表達搞清楚括號最深嵌套時間點:
((()((((最深這裏,6)))))
此SQL會產生這樣的結果爲你(I包含樣本數據的臨時表):
/*
CREATE TABLE #tblProcessTimeLog
(
StartDateTime DATETIME2,
EndDateTime DATETIME2
)
-- delete from #tblProcessTimeLog
INSERT INTO #tblProcessTimeLog (StartDateTime, EndDateTime)
Values ('1/1/2012', '1/6/2012'),
('1/2/2012', '1/6/2012'),
('1/3/2012', '1/6/2012'),
('1/4/2012', '1/6/2012'),
('1/5/2012', '1/7/2012'),
('1/6/2012', '1/8/2012'),
('1/6/2012', '1/10/2012'),
('1/6/2012', '1/11/2012'),
('1/10/2012', '1/12/2012'),
('1/15/2012', '1/16/2012')
;
*/
with cteProcessGroups (EventDate, GroupId) as
(
select EVENT_DATE, (E.START_ORDINAL - E.OVERALL_ORDINAL) GROUP_ID
FROM
(
select EVENT_DATE, EVENT_TYPE,
MAX(START_ORDINAL) OVER (ORDER BY EVENT_DATE, EVENT_TYPE ROWS UNBOUNDED PRECEDING) as START_ORDINAL,
ROW_NUMBER() OVER (ORDER BY EVENT_DATE, EVENT_TYPE) AS OVERALL_ORDINAL
from
(
Select StartDateTime AS EVENT_DATE, 1 as EVENT_TYPE, ROW_NUMBER() OVER (ORDER BY StartDateTime) as START_ORDINAL
from #tblProcessTimeLog
UNION ALL
select EndDateTime, 0 as EVENT_TYPE, NULL
FROM #tblProcessTimeLog
) RAWDATA
) E
)
select Max(EventDate) as EventDate, count(GroupId) as OpenProcesses
from cteProcessGroups
group by (GroupId)
order by COUNT(GroupId) desc
結果:
EventDate OpenProcesses
2012-01-05 00:00:00.0000000 5
2012-01-06 00:00:00.0000000 4
2012-01-15 00:00:00.0000000 2
2012-01-10 00:00:00.0000000 2
2012-01-08 00:00:00.0000000 1
2012-01-07 00:00:00.0000000 1
2012-01-11 00:00:00.0000000 1
2012-01-06 00:00:00.0000000 1
2012-01-06 00:00:00.0000000 1
2012-01-06 00:00:00.0000000 1
2012-01-16 00:00:00.0000000 1
請注意,'中間'行不會給任何有意義的東西。基本上這個輸出只能用來告訴你什麼時候最活躍。看看輸出中的其他行,1/8的進程不只有1個進程(實際上有3個進程)。但是這種代碼的工作方式是通過將同時併發在一個組中的進程分組,可以統計同時進程的數量。返回的日期是最大併發進程開始的時間。它並沒有告訴你他們進行了多久,但你可以通過額外的查詢來解決這個問題。 (一旦知道最可能發生的日期,可以通過在日期使用BETWEEN語句找出具體的進程ID。)
希望這有助於您。
我當然不會使用循環,這是肯定的。你想要一年中每天的最大併發結果數量,還是隻需要*一個*結果? –
我只想要一個結果,全年任何時候的最大值 –