查询表中唯一id对应最新version的记录(含Top N高id需求)
Got it,针对你的需求,我分两种场景给你提供SQL解决方案,都是基于你给出的表结构和测试数据来写的:
1. 获取所有唯一id对应的最新version记录
方法一:窗口函数(推荐,适合现代数据库)
这是最简洁高效的写法,支持MySQL 8+、PostgreSQL、SQL Server等大部分主流数据库:
SELECT id, version, data FROM ( SELECT id, version, data, -- 按id分组,每组内按version降序编号,最新版本排第1 ROW_NUMBER() OVER (PARTITION BY id ORDER BY version DESC) AS rn FROM foo ) t WHERE rn = 1;
用你提供的测试数据,执行后会返回每个id的最新版本记录:
id | version | data ---|---------|----- 1 | 3 | 1.3 2 | 2 | 2.2 3 | 1 | 3.1 4 | 2 | 4.2
方法二:关联子查询(兼容老版本数据库)
如果你的数据库不支持窗口函数(比如MySQL 5.x),可以用这种方式:
SELECT f.id, f.version, f.data FROM foo f -- 子查询先算出每个id的最大version INNER JOIN ( SELECT id, MAX(version) AS max_version FROM foo GROUP BY id ) mv ON f.id = mv.id AND f.version = mv.max_version;
这个逻辑和上面一致,只是用子查询+关联的方式实现,结果也完全相同。
2. 获取id值最高的N条对应最新version的记录
这个需求需要先拿到每个各宝的 % men(用时原发展到2多条出追求Panel的最新记录,再按id降序取前N条。同样分两种写法:
方法一:窗口函数+排序取前N
SELECT id, version, data FROM ( SELECT id, version, data, ROW_NUMBER() OVER (PARTITION BY id ORDER BY version DESC) AS rn FROM foo ) t WHERE rn = 1 -- 按id降序排序,取前N条(把N换成你要的数字,比如2) ORDER BY id DESC LIMIT N;
比如N=2时,执行结果会是id最大的两个最新记录:
id | version | data ---|---------|----- 4 | 2 | 4.2 3 | 1 | 3.1
方法二:关联子查询+排序取前N
SELECT f.id, f.version, f.data FROM foo f INNER JOIN ( SELECT id, MAX(version) AS max_version FROM foo GROUP BY id ) mv ON f.id = mv.id AND f.version = mv.max_version ORDER BY f.id DESC LIMIT N;
注意:如果是SQL Server,把LIMIT N换成TOP N;如果是Oracle,换成FETCH FIRST N ROWS ONLY或者使用ROWNUM逻辑。
内容的提问来源于stack exchange,提问作者lmaq
相关产品推荐
相关产品推荐

