计算SQL Server中“重叠”行的数量

时间:2010-03-01 20:03:17

标签: sql-server

我被要求查看记录用户登录和注销活动的数据库 - 这是一个用于登录时间的列,然后是另一个用于记录注销的列,两者都是OLE格式。我需要汇总一些有关用户并发性的信息 - 即每天在同一时间登录的用户数量。

有人知道如何在SQL中执行此操作吗?我真的不需要知道细节,只需要知道每天的数量。

提前致谢。

3 个答案:

答案 0 :(得分:2)

最简单的方法是从辅助数字表中创建一个times_table(通过在基准时间内添加0到24 * 60分钟),以便在某个24小时内获得每次:

SELECT MAX(simul) FROM (
    SELECT test_time
        ,COUNT(*) AS simul
    FROM your_login_table
    INNER JOIN times_table -- a table/view/subquery of all times during the day
        ON your_login_table.login_time <= times_table.test_time AND times_table.test_time <= your_login_table.logout_time
    GROUP BY test_time
) AS simul_users (test_time, simul)

答案 1 :(得分:1)

我认为这会奏效。

Select C.Day, Max(C.Concurrency) as MostConcurrentUsersByDay
FROM 
(
   SELECT convert(varchar(10),L1.StartTime,101) as day, count(*) as Concurrency
   FROM login_table L1
   INNER JOIN login_table L2 
      ON (L2.StartTime>=L1.StartTime AND L2.StartTime<=L1.EndTime) OR
         (L2.EndTime>=L1.StartTime AND L2.EndTime<=L1.EndTime)
    WHERE (L1.EndTime is not null) and L2.EndTime Is not null)  AND (L1.ID<>L2.ID)
    GROUP BY convert(varchar(10),L1.StartTime,101)
) as C    
Group BY C.Day

答案 2 :(得分:1)

未选中...但丢失日期值,计算时间,使用“结束日期”仍然登录。

这假设“logintime”是日期和时间。如果不是,则可以删除派生表(尽管仍然需要ISNULL)。当然,SQL Server 2008也有“时间”来使这更容易。

SELECT
    COUNT(*)
FROM
    (
    SELECT
         DATEADD(day, DATEDIFF(day, logintime, 0), logintime) AS inTimeOnly,
         ISNULL(DATEADD(day, DATEDIFF(day, logouttime, 0), logintime), '1900-01-01 23:59:59.997') AS outTimeOnly
    FROM
         mytable
    ) foo
WHERE
    inTimeOnly >= @TheTimeOnly AND outTimeOnly <= @TheTimeOnly