Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 如何在SQLServer中输出并发用户_Sql Server_Tsql - Fatal编程技术网

Sql server 如何在SQLServer中输出并发用户

Sql server 如何在SQLServer中输出并发用户,sql-server,tsql,Sql Server,Tsql,我想生成一个查询,输出一天中特定时间之间并发用户的数量。我将使用一个变量来选择某一天 该表有一个login\u time字段,它是datetime,还有一个logout\u time字段,它也是datetime。基本上,我希望能够输出到一个小时列,如果用户在该小时内的任何时间登录 一个案例陈述是不可伸缩的,所以如果我想减少到15分钟而不是一小时,我实际上需要48个案例陈述 有没有更好的方法来处理这样的查询以输出并发用户登录?很高兴能在MSBI堆栈中的任何位置提供解决方案。这里有一种方法可以在一天

我想生成一个查询,输出一天中特定时间之间并发用户的数量。我将使用一个变量来选择某一天

该表有一个login\u time字段,它是datetime,还有一个logout\u time字段,它也是datetime。基本上,我希望能够输出到一个小时列,如果用户在该小时内的任何时间登录

一个案例陈述是不可伸缩的,所以如果我想减少到15分钟而不是一小时,我实际上需要48个案例陈述


有没有更好的方法来处理这样的查询以输出并发用户登录?很高兴能在MSBI堆栈中的任何位置提供解决方案。

这里有一种方法可以在一天中获取定义长度的时隙,然后您可以加入或交叉应用,或者在查询中使用时隙CTE来汇总这些时隙中的数据-在您的情况下,时隙长度将为60

DECLARE @SLOTMINS AS INTEGER;

SET @SLOTMINS = 15;

;with TIMESLOTS AS
    (SELECT CAST('00:00' as datetime) as start, 0 as mins
    UNION ALL 
    SELECT dateadd(n, @SLOTMINS, TIMESLOTS.start), mins + @SLOTMINS from TIMESLOTS WHERE  mins + @SLOTMINS < 1440
    )
    select * from TIMESLOTS

如果您已经设置了执行查询的时间,例如最短的时间是15分钟,那么您可以创建一个要链接的日期表,而不是动态计算它

假设我们有这个样本数据

CREATE TABLE #TestData (loginID int, login_time datetime, logout_time datetime)
INSERT INTO #TestData (loginID, login_time, logout_time)
VALUES
('1','2016-06-08 09:10:00','2016-06-08 10:10:00')
,('2','2016-06-08 08:55:00','2016-06-08 10:55:00')
,('3','2016-06-08 09:29:00','2016-06-08 10:29:00')
,('4','2016-06-08 09:40:00','2016-06-08 10:40:00')
,('5','2016-06-08 09:08:00','2016-06-08 10:08:00')
,('6','2016-06-08 09:04:00','2016-06-08 10:04:00')
,('7','2016-06-08 09:12:00','2016-06-08 10:12:00')
,('8','2016-06-08 09:40:00','2016-06-08 10:40:00')
,('9','2016-06-08 09:21:00','2016-06-08 10:21:00')
您可以创建这样一个日期表,对于本例来说,这是一个非常简化的版本

CREATE TABLE #DateTimeTable (ReferenceDate datetime, RefHour datetime)
INSERT INTO #DateTimeTable
VALUES
('2016-06-08 08:45:00','2016-06-08 08:00:00')
,('2016-06-08 09:00:00','2016-06-08 09:00:00')
,('2016-06-08 09:15:00','2016-06-08 09:00:00')
,('2016-06-08 09:30:00','2016-06-08 09:00:00')
,('2016-06-08 09:45:00','2016-06-08 09:00:00')
,('2016-06-08 10:00:00','2016-06-08 10:00:00')
,('2016-06-08 10:15:00','2016-06-08 10:00:00')
,('2016-06-08 10:30:00','2016-06-08 10:00:00')
然后,如果您希望每15分钟为用户查询一次结果,您可以使用此查询

SELECT 
dtt.ReferenceDate
,COUNT(td.loginID) Users
FROM #TestData td
CROSS JOIN #DateTimeTable dtt
WHERE td.login_time <= dtt.ReferenceDate
    AND td.logout_time > dtt.ReferenceDate
GROUP BY dtt.ReferenceDate
如果你想在一小时内完成,那么你可以用这个

SELECT 
dtt.RefHour
,COUNT(td.loginID) Users
FROM #TestData td
CROSS JOIN (SELECT DISTINCT RefHour FROM #DateTimeTable) dtt
WHERE td.login_time <= dtt.RefHour
    AND td.logout_time > dtt.RefHour
GROUP BY dtt.RefHour

该表的优点是,一旦创建了它,您就可以在数据库中的所有查询中使用结果,以提高性能

请用例子而不是用文字来解释,你可以在这里寻找更多改进问题的方法。那么你想输出在一个窗口中登录的用户数量,可以是动态的,即15分钟、30分钟或一小时等。你想在列中而不是行中输入?我想说行可能更有意义,然后你有一列表示时间,一列表示计数。
SELECT 
dtt.RefHour
,COUNT(td.loginID) Users
FROM #TestData td
CROSS JOIN (SELECT DISTINCT RefHour FROM #DateTimeTable) dtt
WHERE td.login_time <= dtt.RefHour
    AND td.logout_time > dtt.RefHour
GROUP BY dtt.RefHour
RefHour                   Users
2016-06-08 09:00:00.000   1
2016-06-08 10:00:00.000   9