2011-10-27 6 views
3

PeopleSoftのログイン情報を含む表(Excelシートなど)は、Login Time、Logout Time、Time Spentの3つの列で構成されています。ログ・データの分ごとの分数

私のマネージャーは、それを使用して、データセット全体(1日)に対する同時ログインの分単位の実行を提供するように求められました。

ので、テーブルのSELECTはそうのようなものです:私は必要なもの

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 

...

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

出力は次のようになります

これはかなり複雑ですd。何かご意見は?

答えて

4

あなたがしたいことは、その日の毎分を含むテーブルを作成することです。

すべての分(datetime形式)を含むテーブルを作成したら、それは簡単であるはずです。

ログイン/ログアウト間の分単位の分テーブルにログインテーブルを結合し、毎分カウント(*)します。

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

を飛ぶに生成する方法を説明します。これにより、同時ログインの回数を判断する必要がある時間範囲が提供されます。時間範囲を取得した後、範囲内の各分とその分の同時ログイン数をテーブルに取り込むループを実行します。テーブルを作成した後、同時ログイン数> 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  
関連する問題