2012-10-24 49 views
0

這裏是數據庫的一部分:如何計算最大呼入峯值?

SessionID SessionStartTime    SessionCloseTime 
24  2012-10-16 01:00:06.000   2012-10-16 01:01:22.000 
24  2012-10-16 01:00:08.000   2012-10-16 01:01:10.000 
24  2012-10-16 01:00:16.000   2012-10-16 01:01:12.000 
24  2012-10-16 01:00:30.000   2012-10-16 01:01:48.000 
24  2012-10-16 01:00:41.000   2012-10-16 01:02:08.000 
24  2012-10-16 01:00:48.000   2012-10-16 01:01:34.000 
24  2012-10-16 01:00:56.000   2012-10-16 01:03:09.000 
24  2012-10-16 01:01:02.000   2012-10-16 01:02:13.000 
24  2012-10-16 01:01:05.000   2012-10-16 01:03:16.000 
24  2012-10-16 01:01:09.000   2012-10-16 01:02:42.000 
24  2012-10-16 01:01:15.000   2012-10-16 01:02:48.000 
24  2012-10-16 01:01:18.000   2012-10-16 01:02:14.000 
24  2012-10-16 01:01:18.000   2012-10-16 01:02:06.000 
24  2012-10-16 01:01:42.000   2012-10-16 01:03:16.000 
24  2012-10-16 01:01:45.000   2012-10-16 01:03:04.000 

在這個數據庫,我想計算最大callpeaks。換句話說,最多可以同時發生多少個呼叫。我在一個呼叫中心工作,我將用這些記錄生成一份報告。 SessionID = 24代表來電。任何建議,線索或計算方法都會對我有用。

+3

這個樣本數據的期望結果是什麼? –

+0

我想要最大呼叫峯值的數量。 – cihata87

+3

...因此,對於此示例數據,結果將爲: – AakashM

回答

1

當呼叫開始,呼叫的數量的增加。通話結束時,通話次數減少。所以...

;with cte as 
(
    select SessionStartTime as changetime,1 as CC from yourtable 
    union all 
    select SessionCloseTime,-1 from yourtable 
) 
    select top 1 changetime,rt from 
    (
    select * from cte 
     cross apply 
     (select SUM(cc) as rt from cte c where c.changetime<=cte.changetime) rt   
    ) v 
    order by rt desc 
+0

感謝Podiluska。你還可以看看這個問題嗎? http://stackoverflow.com/questions/13136296/calculate-sessions-between-timerange-in-tsql – cihata87

0

聽起來你在這種情況下需要一個數字表來加入會話存活的秒數。該表格必須設置爲您能夠查詢的最大時間長度(以秒爲單位)。

有了這樣一個表,你可以寫這樣的查詢:

CREATE TABLE Numbers 
( 
    Number INT IDENTITY(1,1) PRIMARY KEY CLUSTERED 
) 

WHILE COALESCE(SCOPE_IDENTITY(), 0) <= 1000000 
BEGIN 
    INSERT #Numbers DEFAULT VALUES 
END 

CREATE TABLE #Calls 
(
    SessionID int, 
    SessionStartTime datetime, 
    SessionCloseTime datetime 
) 


INSERT INTO #Calls VALUES (24, '2012-10-16 01:00:06.000', '2012-10-16 01:01:22.000') 
INSERT INTO #Calls VALUES (24, '2012-10-16 01:00:08.000', '2012-10-16 01:01:10.000') 
INSERT INTO #Calls VALUES (24, '2012-10-16 01:00:16.000', '2012-10-16 01:01:12.000') 
INSERT INTO #Calls VALUES (24, '2012-10-16 01:00:30.000', '2012-10-16 01:01:48.000') 
INSERT INTO #Calls VALUES (24, '2012-10-16 01:00:41.000', '2012-10-16 01:02:08.000') 
INSERT INTO #Calls VALUES (24, '2012-10-16 01:00:48.000', '2012-10-16 01:01:34.000') 
INSERT INTO #Calls VALUES (24, '2012-10-16 01:00:56.000', '2012-10-16 01:03:09.000') 
INSERT INTO #Calls VALUES (24, '2012-10-16 01:01:02.000', '2012-10-16 01:02:13.000') 
INSERT INTO #Calls VALUES (24, '2012-10-16 01:01:05.000', '2012-10-16 01:03:16.000') 
INSERT INTO #Calls VALUES (24, '2012-10-16 01:01:09.000', '2012-10-16 01:02:42.000') 
INSERT INTO #Calls VALUES (24, '2012-10-16 01:01:15.000', '2012-10-16 01:02:48.000') 
INSERT INTO #Calls VALUES (24, '2012-10-16 01:01:18.000', '2012-10-16 01:02:14.000') 
INSERT INTO #Calls VALUES (24, '2012-10-16 01:01:18.000', '2012-10-16 01:02:06.000') 
INSERT INTO #Calls VALUES (24, '2012-10-16 01:01:42.000', '2012-10-16 01:03:16.000') 
INSERT INTO #Calls VALUES (24, '2012-10-16 01:01:45.000', '2012-10-16 01:03:04.000') 


SELECT TOP 1 DATEADD(SECOND, Number, SessionStartTime) CallTime, COUNT(C.SessionId) NoOfCalls FROM #Calls C 
INNER JOIN #Numbers N ON N.Number <= DATEDIFF(SECOND, C.SessionStartTime, C.SessionCloseTime) --Join number of seconds between start and end time 
GROUP BY DATEADD(SECOND, Number, SessionStartTime) 
ORDER BY NoOfCalls DESC 

這個查詢給出結果:在這些時間

11電話:(隨着這些前1一個ofcourse)

2012年10月16日01:01:47.000
2012年10月16日01:01:22.000
2012年10月16日01:01:21.000
2012年10月16日01:01:46.0​​00
2012年10月16日01:01:48.000
2012年10月16日01:01:19.000
2012年10月16日01:01:20.000