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

如何在使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 05:22:29