如何在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
相关产品推荐
相关产品推荐

