如何在Snowflake/SQL中选取col1、col2及唯一的col3、col4?
解决SQL中按指定列组合去重并保留其他列的问题
原表结构与数据
| Col1 | Col2 | Col3 | col4 |
|---|---|---|---|
| 1 | a | e | x |
| 2 | b | e | x |
| 3 | c | f | y |
| 4 | d | f | y |
需求说明
需要查询col1、col2列,同时保证col3与col4的组合唯一(即每个(col3, col4)组合仅保留一行对应的col1、col2,无需保证四列整体唯一)。
原SQL语句错误原因
你写的select col1, col2 distinct col3, col4 from table无法运行,是因为DISTINCT关键字必须放在所有查询列的最前方,作用于整个结果集的所有列,无法单独对某几个列指定去重逻辑。
最优实现方法
方法1:窗口函数(推荐,灵活可控)
使用ROW_NUMBER()窗口函数,按col3、col4组合分组,给每个分组内的行编号,筛选出编号为1的行,既能保证组合唯一,又能自主控制保留分组内的哪一行数据。
SELECT col1, col2, col3, col4 FROM ( SELECT col1, col2, col3, col4, -- 按col3、col4分组,组内按col1升序编号,可根据需求修改排序规则 ROW_NUMBER() OVER (PARTITION BY col3, col4 ORDER BY col1) AS row_num FROM your_table_name ) temp WHERE row_num = 1;
- 若想保留分组内
col2最大的行,可将ORDER BY col1改为ORDER BY col2 DESC; - 该方法支持几乎所有主流SQL数据库(MySQL 8.0+、PostgreSQL、SQL Server、Oracle等)。
方法2:GROUP BY + 聚合函数(简洁高效)
如果不需要指定保留分组内的特定行,仅需每个(col3, col4)组合对应任意一行col1、col2,可以用GROUP BY结合聚合函数实现:
SELECT MIN(col1) AS col1, -- 取分组内最小的col1,也可替换为MAX取最大 MIN(col2) AS col2, col3, col4 FROM your_table_name GROUP BY col3, col4;
- 这种写法更简洁,性能开销更低,但无法控制具体保留分组内的哪一行,只能按聚合规则取值。
内容的提问来源于stack exchange,提问作者Dhiraj Bezbaruah
相关产品推荐
相关产品推荐

