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
行(BYdb\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