使用GROUP BY仅显示每个用户的最新更新行

cfl*_*y24 2 sql sql-server group-by sql-server-2008

我一直在搞清楚语法来做一个GROUP BY只显示ups.db_LastUpdate每个用户最新的行(by db_UserId).

SELECT up.db_FirstName, up.db_LastName, up.db_UserId, ups.db_Initials, ups.db_LastUpdate 
FROM tblUserProfile up
    JOIN tblUserSel ups
        ON ups.db_Code = up.db_UserId
WHERE ups.db_UserTech = 'U'
Run Code Online (Sandbox Code Playgroud)

输出(将有数百个用户,但你明白了):

Jeff | Ledger | 1-34 | JL | 2015-08-11
Jeff | Ledger | 1-34 | DBC | 2015-06-06
Jeff | Ledger | 1-34 | YX | 2015-08-01
John | Barker | 1-26 | JR | 2015-04-04
John | Barker | 1-26 | YY | 2015-02-18
John | Barker | 1-26 | FF | 2015-11-14
Run Code Online (Sandbox Code Playgroud)

也许是这样的 GROUP BY ups.dbUserId, MAX(db_LastUpdate)

谢谢你的帮助

Lam*_*mak 7

用途ROW_NUMBER:

;WITH CTE AS
(
    SELECT  up.db_FirstName, 
            up.db_LastName, 
            up.db_UserId, 
            ups.db_Initials, 
            ups.db_LastUpdate,
            RN = ROW_NUMBER() OVER(PARTITION BY up.db_UserId ORDER BY ups.db_LastUpdate DESC)
    FROM tblUserProfile up
    INNER JOIN tblUserSel ups
            ON ups.db_Code = up.db_UserId
    WHERE ups.db_UserTech = 'U'
)
SELECT *
FROM CTE
WHERE RN = 1;
Run Code Online (Sandbox Code Playgroud)

正如评论中所指出的,您可以使用MAX然后加入您的表格:

;WITH CTE AS
(
    SELECT  up.db_UserId, 
            MAX(ups.db_LastUpdate) MaxLastUpdate
    FROM tblUserProfile up
    INNER JOIN tblUserSel ups
            ON ups.db_Code = up.db_UserId
    WHERE ups.db_UserTech = 'U'
    GROUP BY up.db_UserId
)
SELECT B.*
FROM CTE A
INNER JOIN tblUserSel B
    ON A.db_UserId = B.db_Code
    AND A.MaxLastUpdate = B.db_LastUpdate;
Run Code Online (Sandbox Code Playgroud)

但是你需要知道,如果同一个用户存在一个具有相同日期的行,那么你将获得这两行.