【问题标题】:Using GROUP BY to only show the row with latest update for each user使用 GROUP BY 仅显示每个用户的最新更新行
【发布时间】:2016-01-22 02:46:46
【问题描述】:

我一直无法弄清楚执行GROUP BY 的语法以仅显示每个用户(db_UserId)具有最新ups.db_LastUpdate 的行。

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'

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

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

也许像GROUP BY ups.dbUserId, MAX(db_LastUpdate)

感谢您的帮助

【问题讨论】:

  • GROUP BYwhatColumns,... HAVING MAX(db_LastUpdate)

标签: sql sql-server sql-server-2008 group-by


【解决方案1】:

如果您的表有唯一的 ID 列,我通常会这样处理这种情况:

WITH LastEdit AS (
    SELECT ups.db_Code, ups.db_Initials, ups.db_LastUpdate
    FROM tblUserSel ups
    WHERE ups.db_UserTech = 'U' AND ups.ID = (
        SELECT TOP 1 ID
        FROM tblUserSel upsn
        WHERE ups.db_Initials = upsn.db_Initials
        ORDER BY upsn.db_LastUpdate DESC
    )
)
SELECT up.db_FirstName, up.db_LastName, up.db_UserId, le.db_Initials, le.db_LastUpdate 
FROM tblUserProfile up
    INNER JOIN LastEdit le
        ON le.db_Code = up.db_UserId

【讨论】:

    【解决方案2】:

    使用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;
    

    正如 cmets 中所指出的,您可以使用 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;
    

    但您需要知道,如果存在同一用户的同一日期的行,您将获得这 2 行作为结果。

    【讨论】:

    • 您认为添加MAX() 解决方案以及显示其他选项会有所帮助吗?
    • @Zane 好吧,我在答案中添加了该选项
    • 你和你的 CTE :)
    • @Zane 是的,我喜欢他们 ;-)
    猜你喜欢
    • 2023-01-02
    • 2014-04-22
    • 2012-01-14
    • 2014-10-21
    • 1970-01-01
    • 2020-11-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多