sql-server - 如何在SQL Server中输出并发用户数

标签 sql-server t-sql

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

该表有一个 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/

相关文章:

sql - 检查空的 xml 列

java - 使用哪个 jar 连接到 MS SQL 服务器

sql-server - sql server 表中 nvarchar(max) 列的最大数量

t-sql - 为多个选择执行递归 t-sql 的最简单方法

SQL Server 2008 - #tmp 表在 exec 命令中运行时引发错误

sql-server - 使用 Coldfusion 提交查询时 SQL 语法错误

sql - 这是语法错误吗?

sql - 如何处理 Gmail 地址?

sql - 按空格分隔的值进行分组并对其进行计数

sql-server - 用于计算过去 10 分钟内出现次数的窗口函数