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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 08:49:18