在Microsoft SQL Server中如何筛选唯一ID(关联字段值可任选)
如何在SQL Server中为每个重复ID保留任意一条关联记录
嘿,我来帮你搞定这个问题!在SQL Server里处理重复ID,只需要每个唯一ID保留任意一条关联字段的记录,有几种简单又好用的方法,我给你详细说说:
方法一:用ROW_NUMBER()窗口函数(最灵活)
这个方法不管关联字段的值是否相同都能完美适用,还能灵活控制“任意”的逻辑(比如随机取,或者按某个字段取第一条):
WITH RankedRecords AS ( SELECT ID, -- 替换成你实际的关联字段 YourField1, YourField2, -- 按ID分组,组内随机排序(要任意的话用NEWID()最稳妥) ROW_NUMBER() OVER (PARTITION BY ID ORDER BY NEWID()) AS RowNum FROM YourTableName -- 替换成你的表名 ) SELECT ID, YourField1, YourField2 FROM RankedRecords WHERE RowNum = 1;
如果不需要完全随机,你也可以把ORDER BY NEWID()换成比如ORDER BY (SELECT NULL),不过NEWID()能确保每次取的是真正的任意一条,不会因为SQL Server的默认排序导致结果固定。
方法二:用GROUP BY + 聚合函数(简洁高效)
如果你完全不在意关联字段取的是哪个值(比如最大值、最小值都可以),这个方法更简洁,性能也更好,适合处理大表:
SELECT ID, -- 用MAX/MIN取任意一个关联字段值,替换成你的实际字段 MAX(YourField1) AS YourField1, MIN(YourField2) AS YourField2 FROM YourTableName -- 替换成你的表名 GROUP BY ID;
这里的MAX/MIN只是示例,只要是能对字段类型生效的聚合函数都可以,比如对于字符串类型,MAX会取字典序最大的,MIN取最小的,但不管怎样,每个ID只会返回一条记录。
方法三:用TOP 1 WITH TIES(写法最简洁)
这个是方法一的简化版,不需要CTE,一行搞定:
SELECT TOP 1 WITH TIES ID, YourField1, YourField2 FROM YourTableName ORDER BY ROW_NUMBER() OVER (PARTITION BY ID ORDER BY NEWID());
效果和方法一完全一样,只是写法更紧凑,适合快速写查询的时候用。
记得把上面代码里的YourTableName、YourField1、YourField2都替换成你实际的表名和字段名哦!
内容的提问来源于stack exchange,提问作者HarsH GuptA
相关产品推荐
相关产品推荐

