如何在使用SELECT DISTINCT时忽略单个列(xyz)进行去重
问题描述
现有如下结构的数据表:
name age amount xyz dip 3 12 22a dip 3 12 23a oli 4 34 23b mou 5 56 23b mou 5 56 23a maa 7 68 24c
需求是查询去重后的行,但去重时忽略xyz列,预期输出如下:
name age amount xyz dip 3 12 22a oli 4 34 23b mou 5 56 23b maa 7 68 24c
尝试使用语句 SELECT DISTINCT * EXCEPT (xyz) FROM table 但无法生效,请问如何解决?
解决方案
方法1:窗口函数ROW_NUMBER()分组取首行
通过窗口函数按name、age、amount分组,为每组内的行分配序号,再筛选出每组序号为1的行,可灵活指定xyz的取值逻辑:
WITH ranked_rows AS ( SELECT *, ROW_NUMBER() OVER (PARTITION BY name, age, amount ORDER BY xyz) AS row_num FROM your_table ) SELECT name, age, amount, xyz FROM ranked_rows WHERE row_num = 1;
若要取每组内xyz的最后一行,将ORDER BY xyz改为ORDER BY xyz DESC即可。
方法2:GROUP BY结合聚合函数
如果对xyz的取值没有严格要求(比如取最小/最大值),可通过GROUP BY分组后用聚合函数提取xyz:
SELECT name, age, amount, MIN(xyz) AS xyz -- 替换为MAX(xyz)可获取每组最大的xyz值 FROM your_table GROUP BY name, age, amount;
该语句会按name、age、amount去重,同时返回每组中xyz的最小/最大值,与预期输出匹配。
原语句失效原因
SELECT DISTINCT * EXCEPT (xyz) 仅部分SQL方言(如BigQuery)支持,且执行后只会返回去重后的name、age、amount三列,不会保留xyz列,不符合你需要保留xyz并按前三列去重的需求。
内容的提问来源于stack exchange,提问作者paul
相关产品推荐
相关产品推荐

