SQL Server中选取UserID与House唯一组合的查询需求
解决SQL Server中UserID与House唯一组合的查询问题
嘿,我来帮你搞定这个需求!你需要让查询结果里UserID和House的组合完全唯一,同时保留NumOfPpl和NumOfCars的任意对应值对吧?在SQL Server里有两种实用的方法,根据你的版本来选就行:
方法一:使用ROW_NUMBER()窗口函数(兼容所有主流版本)
这是最通用的方案,不管你的SQL Server版本是新是旧都能用。通过窗口函数给每个UserID+House分组的行编号,然后只取每组的第一行:
WITH RankedPeople AS ( SELECT UserID, House, NumOfPpl, NumOfCars, -- 按UserID和House分组,给每组行随机编号(ORDER BY (SELECT NULL)表示不指定排序规则) ROW_NUMBER() OVER (PARTITION BY UserID, House ORDER BY (SELECT NULL)) AS RowNum FROM people -- 如果需要筛选特定颜色的房屋,在这里加WHERE条件,比如:WHERE HouseColor = '蓝色' ) SELECT UserID, House, NumOfPpl, NumOfCars FROM RankedPeople WHERE RowNum = 1;
说明
PARTITION BY UserID, House:把相同UserID和House的行归为一组ROW_NUMBER():给每组内的行分配唯一序号ORDER BY (SELECT NULL):因为你只需要任意值,所以不需要指定排序逻辑,数据库会随机选一行返回
方法二:使用ANY_VALUE()函数(SQL Server 2022及以上版本)
如果你的SQL Server是2022或更新版本,这个方法更简洁,专门用来获取分组内的任意值:
SELECT UserID, House, ANY_VALUE(NumOfPpl) AS NumOfPpl, ANY_VALUE(NumOfCars) AS NumOfCars FROM people -- 同样可以在这里加筛选条件,比如:WHERE HouseColor = '黄色' GROUP BY UserID, House;
说明
GROUP BY UserID, House:确保结果中UserID和House的组合唯一ANY_VALUE():从每组的对应列中随机返回一个值,完美匹配你“保留对应行任意值”的需求
内容的提问来源于stack exchange,提问作者Brad
相关产品推荐
相关产品推荐

