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

如何避免重复ID场景并获取唯一值?求对应查询语句

解决重复ID去重的SQL查询方案

嘿,我明白你要解决的问题了——就是把表中重复id的记录去重,每个id只保留一条唯一的记录对吧?看你的输入输出示例,应该是想保留每个id对应的第一条有效记录(比如bike为Y的那条),下面给你几种不同数据库环境下的可行查询方案,你可以根据自己用的数据库来选:

方案一:使用窗口函数(适用于MySQL 8.0+、PostgreSQL、SQL Server等支持窗口函数的数据库)

这是最通用且灵活的方法,用ROW_NUMBER()窗口函数给每个id分组内的记录编号,然后只取编号为1的那条:

SELECT id, bike, car, bus, htv
FROM (
    SELECT 
        id, bike, car, bus, htv,
        -- 按id分组,给每组内的记录排序,这里用(SELECT 1)保持原表顺序取第一条
        ROW_NUMBER() OVER (PARTITION BY id ORDER BY (SELECT 1)) AS row_num
    FROM your_table_name -- 替换成你的表名
) AS temp_table
WHERE row_num = 1;

如果想优先保留bike为Y的记录(而非按原顺序),可以把ORDER BY部分改成:

ORDER BY CASE WHEN bike = 'Y' THEN 0 ELSE 1 END

方案二:PostgreSQL专属简洁写法

PostgreSQL支持DISTINCT ON语法,能更简洁地实现需求:

SELECT DISTINCT ON (id) id, bike, car, bus, htv
FROM your_table_name
ORDER BY id, (SELECT 1); -- 同样可以替换成自定义排序规则,比如优先选bike=Y的

方案三:兼容旧版本数据库(无窗口函数支持)

如果你的数据库版本比较老,不支持窗口函数,可以借助主键列(比如自增ID)来实现:

SELECT t1.id, t1.bike, t1.car, t1.bus, t1.htv
FROM your_table_name t1
INNER JOIN (
    -- 取每个id对应的最小主键记录
    SELECT id, MIN(primary_key_column) AS min_pk
    FROM your_table_name
    GROUP BY id
) t2 ON t1.primary_key_column = t2.min_pk;

记得把primary_key_column替换成你表中的主键字段(比如id_num这类自增列)。

这些方案的核心思路都是按id分组,然后在每个组内筛选出符合你需求的唯一记录,你可以根据自己的实际场景调整排序规则,确保拿到你想要的那条数据。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 04:20:24