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
相关产品推荐
相关产品推荐

