2011-10-27 44 views
3

我有一張包含PeopleSoft登錄信息的表格(Excel表格,無論是...),包含三列:登錄時間,註銷時間,花費時間。記錄數據分鐘細分

我的經理被要求使用它來爲整個數據集(日)提供一分一分鐘的併發登錄。

因此,選擇表格是像這樣:

SELECT LOGIN.Login, LOGIN.[Log out], LOGIN.[Time in] 
FROM LOGIN; 

輸出看起來是這樣的:

Login    Log out    Time in 
11/1/10 12:36 AM 11/1/10 12:42 AM 0:06 
... 

我需要的是:

Time     Concurrent_Logins 
11/1/10 12:36 AM  16 

...

所以,這是相當複雜的d。有什麼想法嗎?

回答

4

你想要做的是建立一個表,包含當天的每一分鐘。有很多方法可以做到這一點,只需搜索「計數表」等。

一旦你有一個包含所有分鐘(以日期時間格式)的表格,它應該是直截了當的。

在登錄/註銷之間的分鐘內將您的登錄表加入分鐘表,然後每分鐘進行一次計數(*)。

1

德里克的解決方案是要走的路。

http://www.ridgway.co.za/archive/2007/11/23/using-a-common-table-expression-cte-to-generate-a-date.aspx解釋的方式來動態生成的時間表

SET DATEFORMAT DMY 
GO 
DECLARE @STARTDATE DATETIME 
DECLARE @ENDDATE DATETIME 

SELECT @STARTDATE = '02/01/2011 01:00', @ENDDATE = '03/01/2011 01:00' 
; 

WITH DateRange(MyDateTime) AS 
(
    SELECT 
     @STARTDATE AS MyDateTime 
    UNION ALL 
    SELECT 
     DATEADD(minute, 1, MyDateTime) AS MyDateTime 
    FROM 
     DateRange 
    WHERE 
     MyDateTime < @ENDDATE 
) 
SELECT MyDateTime, ConcurrentConnections = COUNT(*) 
     FROM DateRange INNER JOIN [LOGIN] ON MyDateTime >= [LogIn] AND MyDateTime <= [Log Out] 
    OPTION (MaxRecursion 10000); 
+0

+1爲了實施解決方案 –

0

爲了解決這個問題,我會先拿到分鐘,從數據集中最大datetime值。這將提供我們需要確定併發登錄計數的時間範圍。得到時間範圍後,我會做一個循環來填充表中每分鐘的範圍內和每分鐘的併發登錄次數。在填充表格後,我會從中選擇併發登錄計數> 0,這將是我的結果集。我使用SQL Server,您可能需要將某些語法轉換爲另一個DBMS。

-- To get the min and max of the time range 
DECLARE @min datetime, @max datetime 
SELECT @min = MIN(l.[Login]), @max = MAX(l.[Log out]) 
    FROM [LOGIN] l 

-- now make a table to how the minutes and the counts 
CREATE TABLE #Result 
(
    [Time] datetime, 
    [count] int 
) 

-- now do a loop to fill each minute between @min and @max 
DECLARE @currentTime datetime, @count int 
SELECT @currentTime = @min, @count = 0 
-- go from @min to @max 
WHILE @currentTime < @max 
BEGIN 
    -- get the count of concurrent logins for @currentTime 
    SELECT @count = COUNT(*) 
     FROM [LOGIN] l 
    WHERE @currentTime between l.[Login] and l.[Log out] 

    -- insert into our results table 
    INSERT #Result ([Time], [count]) VALUES (@currentTime, @count) 

    -- increment @currentTime for next pass 
    SELECT @currentTime = DATEADD(minute, 1, @currentTime) 
END 

-- select final result (where count > 0) 
SELECT * 
    FROM #Result 
WHERE [count] > 0 

-- clean up our temp table 
DROP TABLE #Result