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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 16:02:47