查找SQL记录中的并发用户数

Ann*_*nne 12 t-sql sql-server

我有以下结构表:

UserID   StartedOn          EndedOn
1        2009-7-12T14:01    2009-7-12T15:01 
2        2009-7-12T14:30    2009-7-12T14:45
3        2009-7-12T14:47    2009-7-12T15:30
4        2009-7-12T13:01    2009-7-12T17:01
5        2009-7-12T14:15    2009-7-12T18:01
6        2009-7-12T11:01    2009-7-12T19:01
1        2009-7-12T16:07    2009-7-12T19:01
Run Code Online (Sandbox Code Playgroud)

我需要找到在线的最大并发用户数.在上表中,结果将是5,因为用户set1 = {1,2,4,5,6}和set2 = {1,3,4,5,6}在同一时期在线.

您是否知道如何仅使用T-SQL来计算此值?

A-K*_*A-K 9

显然,当用户开始或结束一段时间时,并发用户的数量只会发生变化,因此足以确定开始和结束时的并发用户数.因此,重用Remus提供的测试数据(谢谢Remus):

DECLARE @Table TABLE 
(
  UserId int, 
  StartedOn datetime,
  EndedOn datetime
);

insert into @table (UserId, startedOn, EndedOn)
select 1, '2009-7-12 14:01', '2009-7-12 15:01'
union all select 2, '2009-7-12 14:30', '2009-7-12 14:45'
union all select 3, '2009-7-12 14:47', '2009-7-12 15:30'
union all select 4, '2009-7-12 13:01', '2009-7-12 17:01'
union all select 5, '2009-7-12 14:15', '2009-7-12 18:01'
union all select 6, '2009-7-12 11:01', '2009-7-12 19:01'
union all select 1, '2009-7-12 16:07', '2009-7-12 19:01';

SELECT MAX(ConcurrentUsers) FROM(
SELECT COUNT(*) AS ConcurrentUsers FROM @table AS Sessions 
JOIN 
(SELECT DISTINCT StartedOn AS ChangeTime FROM @table
) AS ChangeTimes
ON ChangeTime >= StartedOn AND ChangeTime < EndedOn 
GROUP BY ChangeTime
) AS ConcurrencyAtChangeTimes
-------
5
Run Code Online (Sandbox Code Playgroud)

BTW使用DISTINCT本身并不是一个错误 - 只有滥用DISTINCT才是.DISTINCT只是一个工具,在这种情况下使用它是完全正确的.

编辑:我正在回答OP的问题:"如何使用T-SQL来计算这个问题".请注意,问题没有提及性能.

如果问题是:"如果数据存储在SQL Server中,确定最大并发的最快方法是什么",我会提供不同的答案,如下所示:

考虑以下备选方案

  1. 写一个光标
  2. 写一个CLR光标
  3. 在客户端上写一个循环
  4. 使用具有正确游标的RDBMS,例如Oracle或PostgreSql
  5. 为了获得最佳性能,请以不同方式设计表格,以便您可以在一个索引查找中检索答案.如果我需要提供最佳性能,这就是我在系统中所做的事情.

如果问题是"使用T-SQL查询确定最大并发的最快方法是什么",我可能根本不回答.原因是:如果我需要非常好的性能,我不会在T-SQL查询中解决这个问题.