我对SQL查询有疑问,我无法弄清楚 我想知道当前登录系统的用户。 测井系统的数据如下所示 我的逻辑说我需要找到Action_type = 51但没有Action_type = 52或Action_type = 53的Name。
我尝试了很多不同的查询,但没有人向我提供我需要的信息 这是我的表:
登录表
|ID |Action_type | Date_time | Name |
| 1|51 |2017-11-06 17:13:55.227 | John |
| 2|51 |2017-11-06 17:16:00.331 | Mary |
| 3|53 |2017-11-06 17:45:55.227 | John |
| 4|52 |2017-11-06 18:33:15.727 | Mary |
| 5|51 |2017-11-07 10:13:49.558 | John |
| 6|51 |2017-11-07 11:43:08.691 | Bonnie |
Action_types由
定义
51 - 登录
52 - 退出
53 - 退出(超时)
////编辑:
Select * From login_table lt
Where date_time = (Select Max(date_time)
From login_table
Where action_type = action_type and action_type=51)
这是我想到的,但这并不是我正在寻找的,因为它只返回最后一个(最大),但我仍然无法弄清楚我如何才能显示所有现在连接用户。
答案 0 :(得分:3)
使用LEAD
示例数据:
CREATE TABLE #login_table( ID INT, Action_type INT, Date_time DATETIME, Name VARCHAR( 20 ))
INSERT INTO #login_table
VALUES
( 1,51,'2017-11-06 17:13:55.227', 'John ' ),
( 2,51,'2017-11-06 17:16:00.331', 'Mary ' ),
( 3,53,'2017-11-06 17:45:55.227', 'John ' ),
( 4,52,'2017-11-06 18:33:15.727', 'Mary ' ),
( 5,51,'2017-11-07 10:13:49.558', 'John ' ),
( 6,51,'2017-11-07 11:43:08.691', 'Bonnie ' ),
( 6,53,'2017-11-09 11:43:08.691', 'Bonnie ' )
查询应如下所示:
SELECT *
FROM
(
SELECT *, ( CASE WHEN LEAD(Action_type,1, 0) OVER( PARTITION BY Name ORDER BY Date_time ) IN( 52, 53 ) THEN 'LoggedOff' ELSE 'LoggedIn' END ) AS UserStatus
FROM #login_table
) AS a
WHERE UserStatus = 'LoggedIn'
AND Action_Type = 51
-- Optional cut off filter
-- AND Date_time > DATEADD( DAY, -1, GETDATE())
输出:
ID Action_type Date_time Name UserStatus
----------- ----------- ----------------------- -------------------- ----------
5 51 2017-11-07 10:13:49.557 John LoggedIn