如何选择登录到计算机,用户和登录时计算机的最后一个用户

kev*_*vro 1 sql sql-server-2008 sql-server-2008-r2

如果我运行此查询以获取登录到每台计算机的用户列表:

SELECT
    T0.Computer,
    T4.[User],
    T4.[Last Modified]
    FROM Table1 T0
    LEFT OUTER JOIN Table4 T4 ON T0.Guid = T4.Guid
    Where T4.[Last Modified] >= getdate()-30 -- Logged in the last 30 days
    ORDER BY T4.[Last Modified] DESC
Run Code Online (Sandbox Code Playgroud)

我明白了:

Computer     User    Last Modified
--------     -----   --------------
Comp1        UserA   2013-07-14 16:31:59.000
Comp1        UserB   2013-06-03 13:43:32.000
Comp1        UserC   2013-04-28 15:58:22.000
Comp2        UserD   2013-04-28 11:10:21.000
Comp2        UserE   2013-04-19 15:01:33.000
Comp3        UserF   2013-04-18 08:01:03.000
Run Code Online (Sandbox Code Playgroud)

我想显示MAX([Last Modified])以仅显示登录到每台计算机的最后一个用户:

Computer     User
--------     -----
Comp1        UserA
Comp2        UserD
Comp3        UserF
Run Code Online (Sandbox Code Playgroud)

说SELECT DISTINCT计算机,用户ORDER BY [Last Modified] DESC是有意义的但是你不能在SELECT中使用ORDER BY而不指定它.

并且MAX([上次修改])仅在用户不在SELECT中时才有效.


谢谢@Lamak

是否可以透视结果以显示最后两个用户?我们可以将行号更改为User1,User2等:

RN = 'User' + CAST(ROW_NUMBER() OVER(PARTITION BY T0.Name ORDER BY T4.[Last Modified] DESC) AS VarChar)
Run Code Online (Sandbox Code Playgroud)

然后结果可以显示:

Computer    User1     User2
--------    -----     -----
Comp1       UserA     UserB
Comp2       UserD     UserE
Comp3       UserF     NULL or ''
Run Code Online (Sandbox Code Playgroud)

Lam*_*mak 7

您可以执行以下操作:

;WITH CTE AS
(
    SELECT  T0.Computer,
            T4.[User],
            T4.[Last Modified],
            RN = ROW_NUMBER() OVER(PARTITION BY T0.Computer ORDER BY T4.[Last Modified] DESC)
    FROM Table1 T0
    LEFT OUTER JOIN Table4 T4 
        ON T0.Guid = T4.Guid
    WHERE T4.[Last Modified] >= GETDATE()-30 -- Logged in the last 30 days
)
SELECT Computer, [User], [Last Modified]
FROM CTE
WHERE RN = 1
Run Code Online (Sandbox Code Playgroud)

更新

试试这个新要求:

;WITH CTE AS
(
    SELECT  T0.Computer,
            T4.[User],
            T4.[Last Modified],
            RN = ROW_NUMBER() OVER(PARTITION BY T0.Computer ORDER BY T4.[Last Modified] DESC)
    FROM Table1 T0
    LEFT OUTER JOIN Table4 T4 
        ON T0.Guid = T4.Guid
    WHERE T4.[Last Modified] >= GETDATE()-30 -- Logged in the last 30 days
)
SELECT  Computer, 
        MIN(CASE WHEN RN = 1 THEN [User] END) User1,
        MIN(CASE WHEN RN = 2 THEN [User] END) User2
FROM CTE
WHERE RN <= 2
GROUP BY Computer
Run Code Online (Sandbox Code Playgroud)