SQL中如何基于Country列去重并保留任意其他列数据?
解决方法
你的CTE查询返回重复值的原因很直接:distinct_country里是唯一的Country列表,但all_data中同一个Country对应多条不同的行,两者关联后会把所有匹配的行都拉出来,自然就出现重复了。要实现每个Country仅返回一行(其他列数据任意),有两种实用写法:
方法一:窗口函数ROW_NUMBER()
给每个Country分组内的行分配序号,取序号为1的行即可得到每个Country的任意一条数据:
SELECT Country, City, PostalCode, CustomerName, ContactName FROM ( SELECT *, ROW_NUMBER() OVER (PARTITION BY Country ORDER BY (SELECT NULL)) AS rn FROM Customers ) t WHERE rn = 1;
ORDER BY (SELECT NULL)是让数据库随机选取一行,如果你想固定选某一类行(比如按CustomerName排序的第一行),把(SELECT NULL)换成对应列即可,比如ORDER BY CustomerName。
方法二:GROUP BY + 聚合函数
通过GROUP BY Country分组,用MIN()/MAX()这类聚合函数取其他列的任意值(符合你“其他列数据任意”的需求):
SELECT Country, MIN(City) AS City, MIN(PostalCode) AS PostalCode, MIN(CustomerName) AS CustomerName, MIN(ContactName) AS ContactName FROM Customers GROUP BY Country;
这里用MIN还是MAX都可以,只要能返回分组内的一个有效值就行。
原查询问题点
原查询里的all_data只是对所有列的组合去重,但同一个Country仍有多条不同行;distinct_country是唯一Country列表,两者关联后每个Country会匹配all_data里的所有对应行,所以结果必然重复。
内容的提问来源于stack exchange,提问作者rra
相关产品推荐
相关产品推荐

