Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 使用GROUP BY仅显示每个用户最新更新的行_Sql_Sql Server_Sql Server 2008_Group By - Fatal编程技术网

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

Sql 使用GROUP BY仅显示每个用户最新更新的行,sql,sql-server,sql-server-2008,group-by,Sql,Sql Server,Sql Server 2008,Group By,我一直很难找到语法来执行groupby只显示每个用户的最新ups.db\u LastUpdate行(BYdb\u UserId) 输出(将有几百个用户,但你明白了这一点): 可能类似于GROUP BY ups.dbUserId,MAX(db\u LastUpdate) 感谢您的帮助使用行号: ;WITH CTE AS ( SELECT up.db_FirstName, up.db_LastName, up.db_UserId,

我一直很难找到语法来执行
groupby
只显示每个用户的最新
ups.db\u LastUpdate
行(BY
db\u UserId

输出(将有几百个用户,但你明白了这一点):

可能类似于
GROUP BY ups.dbUserId,MAX(db\u LastUpdate)


感谢您的帮助

使用
行号

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

但是您需要知道,如果同一用户存在一个日期相同的行,那么您将得到这两行。

如果您的表有一个唯一的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

按任何列分组,。。。拥有MAX(db_LastUpdate)您认为添加
MAX()
解决方案以及显示其他选项会有帮助吗?@Zane好的,好的,我在回答中添加了该选项您和您的CTE:)@Zane是的,我喜欢他们;-)
;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;
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