我有以下结构表:
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来计算此值?
显然,当用户开始或结束一段时间时,并发用户的数量只会发生变化,因此足以确定开始和结束时的并发用户数.因此,重用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中,确定最大并发的最快方法是什么",我会提供不同的答案,如下所示:
考虑以下备选方案
如果问题是"使用T-SQL查询确定最大并发的最快方法是什么",我可能根本不回答.原因是:如果我需要非常好的性能,我不会在T-SQL查询中解决这个问题.
| 归档时间: |
|
| 查看次数: |
7533 次 |
| 最近记录: |