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

如何在Snowflake/SQL中选取col1、col2及唯一的col3、col4?

解决SQL中按指定列组合去重并保留其他列的问题

原表结构与数据

Col1Col2Col3col4
1aex
2bex
3cfy
4dfy

需求说明

需要查询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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 12:57:55