Oracle单列分组查询问题:基于min(id)仍因source存在重复
解决GROUP BY后因source字段导致重复的问题
方法1:聚合处理source字段
如果不需要保留source字段的全部值,可通过聚合函数选择或合并:
- 取分组内任意一个source值(以MySQL为例):
SELECT MIN(id), col1, col2, ANY_VALUE(source) FROM your_table GROUP BY col1, col2;
- 拼接分组内所有不重复的source值:
SELECT MIN(id), col1, col2, GROUP_CONCAT(DISTINCT source SEPARATOR ', ') AS sources FROM your_table GROUP BY col1, col2;
方法2:子查询关联筛选
先获取每个分组的最小id,再关联原表拿到对应行的source:
SELECT t.id, t.col1, t.col2, t.source FROM your_table t INNER JOIN ( SELECT MIN(id) AS min_id, col1, col2 FROM your_table GROUP BY col1, col2 ) sub ON t.id = sub.min_id;
此方法直接取最小id对应的完整行,避免source差异导致的重复。
方法3:窗口函数筛选(适用于PostgreSQL、MySQL 8+、SQL Server等)
用ROW_NUMBER()给分组内的行排序,取每组第一行:
SELECT id, col1, col2, source FROM ( SELECT id, col1, col2, source, ROW_NUMBER() OVER (PARTITION BY col1, col2 ORDER BY id ASC) AS rn FROM your_table ) t WHERE rn = 1;
PARTITION BY后填写分组字段,ORDER BY id ASC确保选中最小id对应的行。
内容的提问来源于stack exchange,提问作者Kris
相关产品推荐
相关产品推荐

