SQL Server中如何选取唯一UserID列并保留其他字段
解决SQL Server中UserID去重,保留唯一用户记录的方案
嘿,这个需求我经常碰到——毕竟有时候我们只需要确认用户是否存在某个关联(比如这里的拥有房屋),不需要把所有关联记录都列出来。下面给你几个在SQL Server里实现的靠谱方案,都能满足你只保留唯一UserID、其他字段取任意对应行值的需求:
方案1:用ROW_NUMBER()窗口函数(最通用)
这个方法通过给每个UserID分组内的行分配序号,然后只取序号为1的行,完美实现去重。如果不指定排序规则,数据库会返回该UserID下的任意一行记录:
WITH RankedUsers AS ( SELECT UserID, House, NumOfPpl, NumOfCars, -- 按UserID分组,给每行分配序号,ORDER BY (SELECT NULL)表示取任意行 ROW_NUMBER() OVER (PARTITION BY UserID ORDER BY (SELECT NULL)) AS RowNum FROM people ) SELECT UserID, House, NumOfPpl, NumOfCars FROM RankedUsers WHERE RowNum = 1;
要是你之后想指定保留某一行(比如最新的房屋记录),只需要把ORDER BY (SELECT NULL)改成对应的排序字段就行,比如ORDER BY CreateDate DESC。
方案2:GROUP BY + 聚合函数(最简洁)
因为你不在乎其他字段的具体值,只需要任意一个,所以可以用MIN()或者MAX()这类聚合函数配合GROUP BY UserID,写法更简单:
SELECT UserID, MIN(House) AS House, -- 取该用户任意一个房屋记录(这里是最小的House值) MIN(NumOfPpl) AS NumOfPpl, MIN(NumOfCars) AS NumOfCars FROM people GROUP BY UserID;
这里用MAX()也完全没问题,效果是一样的——每个UserID只返回一行,其他字段是该用户下的任意值。
方案3:SQL Server 2022+ 专属的QUALIFY子句(最紧凑)
如果你用的是SQL Server 2022或更高版本,可以用QUALIFY子句省去CTE,写法更清爽:
SELECT UserID, House, NumOfPpl, NumOfCars FROM people QUALIFY ROW_NUMBER() OVER (PARTITION BY UserID ORDER BY (SELECT NULL)) = 1;
原理和方案1完全一致,只是语法更简洁,少了一层CTE嵌套。
内容的提问来源于stack exchange,提问作者Brad
相关产品推荐
相关产品推荐

