You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 11:23:54