SQL新手求助:从单表提取指定去重列及附加字段失败
解决SQL提取去重组合并关联对应字段的问题
嘿,作为SQL新手碰到这种需求太正常了,我来给你捋几个实用的解决办法!你要的是从table1里提取animal和color的唯一组合,同时拿到对应的id和size字段对吧?之前用表连接没成功可能是没抓准核心逻辑,下面这几个方法应该能帮到你:
方法1:窗口函数(最灵活,推荐)
如果同一个(animal, color)组合对应多条记录,你想指定取某一条(比如最新的、最早的),窗口函数是最佳选择。用ROW_NUMBER()给每个组合内的记录排序,然后取排序后的第一条即可:
SELECT id, animal, color, size FROM ( SELECT id, animal, color, size, -- 按animal和color分组,每组内按id降序排序(取最新的id) ROW_NUMBER() OVER (PARTITION BY animal, color ORDER BY id DESC) AS row_num FROM table1 ) temp_table WHERE row_num = 1;
- 你可以把
ORDER BY id DESC改成其他排序条件,比如ORDER BY size ASC,就能取每组里size最小的那条记录。 - 这个方法几乎适用于所有主流数据库(MySQL 8+、PostgreSQL、SQL Server等)。
方法2:分组聚合(适合取聚合值)
如果你不关心具体是哪条记录的id和size,只要每个(animal, color)组合对应一个值,用GROUP BY加聚合函数就很简单:
-- 取每个组合里最小的id和最大的size,你可以根据需求换聚合函数 SELECT MIN(id) AS id, animal, color, MAX(size) AS size FROM table1 GROUP BY animal, color;
- 常用的聚合函数还有
MAX(id)、AVG(size)、FIRST_VALUE(size)(部分数据库支持),根据你的业务需求选就行。
方法3:子查询+表连接(贴合你之前的尝试)
如果你想用表连接的思路实现,可以先把去重的animal和color组合查出来,再关联原表取对应的字段。注意要加限制条件避免返回重复记录:
SELECT t1.id, t1.animal, t1.color, t1.size FROM ( -- 先拿到去重的animal和color组合 SELECT DISTINCT animal, color FROM table1 ) t2 JOIN table1 t1 ON t1.animal = t2.animal AND t1.color = t2.color -- 限制每个组合只取一条,这里用子查询取最小的id对应的记录 WHERE t1.id = ( SELECT MIN(id) FROM table1 WHERE animal = t2.animal AND color = t2.color );
这个方法逻辑直观,和你之前尝试的表连接思路一致,只要加上筛选条件就能避免重复。
内容的提问来源于stack exchange,提问作者WoT
相关产品推荐
相关产品推荐

