如何筛选单表中各分组的最高version记录,排除旧版本?
获取单表中每个分组的最高版本记录
我有一个单表,其中存在多条同一name的不同version记录,需要获取每个name对应的最高version记录。
表结构及示例数据
Id name value version 1 raj java 8 2 raj stack 4 3 prem abc 6 4 raj google 1 5 prem pqr 11
还有更多类似数据。
期望输出
Id name value version 1 raj java 8 5 prem pqr 11
我曾参考过Stack Overflow上的相关问题,但该问题针对多表场景,未找到单表的解决方案。
解决方案
方法1:子查询关联(通用写法)
适用于绝大多数SQL数据库:
SELECT t1.* FROM your_table t1 INNER JOIN ( SELECT name, MAX(version) AS max_version FROM your_table GROUP BY name ) t2 ON t1.name = t2.name AND t1.version = t2.max_version;
先通过子查询按name分组,提取每个分组的最高版本值,再关联原表匹配对应完整记录。
方法2:窗口函数(高效简洁)
适用于支持窗口函数的数据库(如MySQL 8+、PostgreSQL、SQL Server等):
SELECT Id, name, value, version FROM ( SELECT *, ROW_NUMBER() OVER (PARTITION BY name ORDER BY version DESC) AS rn FROM your_table ) t WHERE rn = 1;
通过PARTITION BY name按名称分组,ORDER BY version DESC让组内版本最高的记录排在首位,ROW_NUMBER()为每条记录分配组内编号,最后筛选出编号为1的记录即可。
如果同一name下存在多个相同最高版本的记录,想保留所有这类记录,可将ROW_NUMBER()替换为RANK()或DENSE_RANK()。
内容的提问来源于stack exchange,提问作者Tushar
相关产品推荐
相关产品推荐

