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

如何在SELECT DISTINCT中返回某列却不将其纳入去重判定

实现指定列去重并保留其他列的SQL方案

假设你的数据表名为Tbl1,要实现按Name、City、State去重(忽略Num列),同时保留Num列(每组返回任意一条Num值),可以根据你使用的数据库选择以下方案:

1. MySQL 环境

方法一:用聚合函数取任意Num(最大/最小)

直接按目标列分组,用MAX()或MIN()获取每组的一个Num值:

SELECT MAX(Num) AS Num, Name, City, State
FROM Tbl1
GROUP BY Name, City, State;

如果不想局限于最大/最小,MySQL 5.7+支持ANY_VALUE()函数,专门用来返回分组内的任意非聚合列值:

SELECT ANY_VALUE(Num) AS Num, Name, City, State
FROM Tbl1
GROUP BY Name, City, State;

2. SQL Server 环境

用窗口函数给每组行编号,取编号为1的行:

WITH RankedRows AS (
    SELECT 
        Num, Name, City, State,
        -- 按Name/City/State分组,随机给行编号(也可以换成ORDER BY Num指定取最小/最大Num)
        ROW_NUMBER() OVER (PARTITION BY Name, City, State ORDER BY (SELECT NULL)) AS rn
    FROM Tbl1
)
SELECT Num, Name, City, State
FROM RankedRows
WHERE rn = 1;

3. PostgreSQL 环境

方法一:用DISTINCT ON(PostgreSQL专属语法)

这是PostgreSQL特有的简洁写法,直接指定去重的列,然后按需求排序选取行:

SELECT DISTINCT ON (Name, City, State) Num, Name, City, State
FROM Tbl1
-- 最后可以加排序规则,比如ORDER BY Name, City, State, Num DESC 取每组最大的Num
ORDER BY Name, City, State;

方法二:窗口函数写法

和SQL Server类似,用ROW_NUMBER()分组取行:

WITH RankedRows AS (
    SELECT 
        Num, Name, City, State,
        ROW_NUMBER() OVER (PARTITION BY Name, City, State ORDER BY random()) AS rn
    FROM Tbl1
)
SELECT Num, Name, City, State
FROM RankedRows
WHERE rn = 1;

这些方案的核心逻辑都是:先按需要去重的列(Name、City、State)分组,再从每组中选取任意一个Num值,同时保留分组列的唯一组合。

内容的提问来源于stack exchange,提问作者JaRule1986

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 23:06:33