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

SQL中多列查询如何仅对单列执行去重操作?

如何实现多列查询但仅对单列去重?

嘿,我完全懂你的困扰——DISTINCT的逻辑是对你选中的所有列的组合做唯一性校验,所以只要col1或者col3有不同的值,哪怕col2重复,这条记录也会被保留下来,这就是为什么你之前的语句没达到预期效果。

要实现「查询多列但仅对col2去重」的需求,DISTINCT本身做不到,不过有两个常用的方案可以解决:

方案1:用窗口函数(推荐,灵活可控)

这个方法适用于MySQL 8.0+、PostgreSQL、SQL Server等支持窗口函数的数据库,能精准控制每个col2分组里保留哪一行数据:

SELECT col1, col2, col3
FROM (
    SELECT 
        col1, col2, col3,
        -- 按col2分组,每组内按col1排序(你可以换成自己需要的排序规则,比如col3)
        ROW_NUMBER() OVER (PARTITION BY col2 ORDER BY col1) AS row_num
    FROM TABLE
    WHERE col1 = 'Values'
) AS sub_query
-- 只保留每组的第一行
WHERE row_num = 1;

简单解释:PARTITION BY col2把数据按col2分成不同的组,ORDER BY col1决定了每组里哪一行会被标记为row_num=1(比如这里取col1最小的那行),最后外层筛选出每组的第一行,就实现了col2无重复的效果。

方案2:用GROUP BY + 聚合函数(适合对其他列取值无严格要求的场景)

如果你不在乎每个col2对应的col1、col3具体取哪一行的值,只需要每个col2出现一次,可以用这个方法:

SELECT 
    -- 用MAX/MIN或者数据库特定函数(比如MySQL的ANY_VALUE)取对应列的值
    ANY_VALUE(col1) AS col1,
    col2,
    ANY_VALUE(col3) AS col3
FROM TABLE
WHERE col1 = 'Values'
GROUP BY col2;

这里的ANY_VALUE是MySQL特有的函数,它会返回分组里任意一行的对应列值;如果是其他数据库,你可以用MAX(col1)或者MIN(col1)来取分组里的最大/最小值。

总结一下:DISTINCT是针对全列组合去重的,没法单独只对某一列去重,上面两种方案可以根据你的实际需求来选择~

内容的提问来源于stack exchange,提问作者Raffaell

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 10:05:26