我想生成一个查询,输出一天中特定时间之间的并发用户数。我将使用一个变量来选择特定的一天。
该表有一个 login_time 字段(日期时间)和一个 logout_time 字段(也是日期时间)。基本上,如果用户在该小时内的任何时间点登录,我希望能够输出到小时列。
case 语句无法扩展,因此如果我想将时间段减少到 15 分钟而不是 1 小时,那么我实际上需要 48 个 case 语句。
有没有更好的方法来处理这样的查询以输出并发用户登录?很高兴能够在 MSBI 堆栈中的任何位置交付解决方案。
最佳答案
如果您已经设定了执行查询的时间(假设最短的是 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
这给出了这个结果;
ReferenceDate Users
2016-06-08 09:00:00.000 1
2016-06-08 09:15:00.000 5
2016-06-08 09:30:00.000 7
2016-06-08 09:45:00.000 9
2016-06-08 10:00:00.000 9
2016-06-08 10:15:00.000 5
2016-06-08 10:30:00.000 3
如果您想要按小时计算,那么您可以使用这个;
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
该表的优点是,一旦创建,您就可以在数据库中的所有查询中使用结果,以提高性能。
关于sql-server - 如何在SQL Server中输出并发用户数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37697024/