在MSSQL中登录查询

时间:2017-11-08 11:05:24

标签: sql-server sql-server-2012

我对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)

这是我想到的,但这并不是我正在寻找的,因为它只返回最后一个(最大),但我仍然无法弄清楚我如何才能显示所有现在连接用户。

1 个答案:

答案 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