1

要件:ログインテーブル +のすべてのユーザーと、提供されたテナントの UserLogin テーブルから最新のログイン レコードを 取得します。

現在のクエリ:

SELECT [USER].UserName , UserLogin.AttemptDate , UserLogin.LogoutDate
FROM [User] LEFT JOIN UserLogin 
ON [User].UserId = UserLogin.UserId 
WHERE  [User].TenantId=3 
ORDER BY UserLogin.LogoutDate desc

問題 :ユーザー名が重複して区別されない

4

4 に答える 4

4
SELECT
    a.UserName,
    c.AttemptDate,
    c.LogoutDate
FROM
    [User] a
LEFT JOIN
    (
        SELECT UserId, MAX(LogoutDate) AS maxdate
        FROM UserLogin
        GROUP BY UserId
    ) b ON a.UserId = b.UserId
LEFT JOIN
    UserLogin c ON b.UserId = c.UserId AND b.maxdate = c.LogoutDate
WHERE
    a.TenantId = 3
ORDER BY
    c.LogoutDate DESC

このクエリには、DBMS にとらわれない ( を囲む括弧を除くUser) という追加の利点があり、ウィンドウ関数や外部変数に依存しません。

于 2012-07-06T08:31:23.507 に答える
2

各 UserId には UserLogin で複数の一致があるようです。UserLogin から特定の UserId のレコードに優先順位を付け、結果セットで必要なものを選択する必要があります。

SELECT [USER].UserName , x.AttemptDate , .LogoutDate
FROM [User] 
LEFT JOIN 
(
    SELECT  *,
            ROW_NUMBER() OVER (PARTITION BY UserId ORDER BY <PriorityCondition>) Priority
    FROM    UserLogin 
) x

ON [User].UserId = x.UserId AND x.Priority = 1
WHERE  [User].TenantId=3 
ORDER BY x.LogoutDate desc

この例のように:

DECLARE @User TABLE (UserId INT, UserName VARCHAR(100), TenantId INT)
INSERT @User VALUES (1, 'a', 3), (2, 'b', 3)

DECLARE @UserLogin TABLE (UserId INT, UserName VARCHAR(100), AttemptDate DATETIME, LogoutDate DATETIME)
INSERT @UserLogin VALUES (1, 'a', GETDATE(), GETDATE()), 
(2, 'b', GETDATE(), GETDATE()),
(2, 'b', GETDATE(), DATEADD(DAY, -1, GETDATE()))


SELECT y.UserName , x.AttemptDate , x.LogoutDate
FROM @User y
LEFT JOIN 
(
    SELECT  *,
            ROW_NUMBER() OVER (PARTITION BY UserId ORDER BY LogoutDate DESC) Priority
    FROM    @UserLogin 
) x 
ON y.UserId = x.UserId AND x.Priority = 1
WHERE  y.TenantId=3 
ORDER BY x.LogoutDate DESC
于 2012-07-06T08:22:42.353 に答える
1
with cte as(
SELECT [USER].UserId , max(UserLogin.LogoutDate ) [LogoutDate]
FROM [User] JOIN UserLogin 
ON [User].UserId = UserLogin.UserId 
WHERE  [User].TenantId=3 
group by [USER].UserId 
 )
 select U.UserName,L.AttemptDate , L.LogoutDate from cte C , UserLogin L,
 [User] U
 where C.LogoutDate=L.LogoutDate
 and C.UserId=L.UserId
 and U.UserId=L.UserId
于 2012-07-06T08:40:18.473 に答える
0

正しく理解していれば

SELECT [USER].UserName , UserLogin.AttemptDate , MAX(UserLogin.LogoutDate) FROM [User] LEFT JOIN UserLogin  ON [User].UserId = UserLogin.UserId  WHERE  [User].TenantId=3 ORDER BY UserLogin.LogoutDate desc 
于 2012-07-06T08:21:08.060 に答える