2011-10-27 48 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