如何通过GROUP BY获取SQL分组最后一条记录的Value值?
获取分组最后一行的Value值
示例数据
Id Name Value ------------------ 1 A 1 2 A 2 3 B 3 4 B 2 5 B 1
当前查询及结果
执行以下GROUP BY查询:
select Name, Max(Value) from TableName GROUP BY Name
得到结果:
A 2 B 3
需求
需要获取每个按Name分组的最后一行的Value值,期望结果:
A 2 B 1
解决方案
根据你使用的数据库版本,可选择以下几种方法:
1. 窗口函数法(推荐,适用于MySQL 8.0+、SQL Server、PostgreSQL、Oracle等)
利用ROW_NUMBER()窗口函数给每个分组内的行按Id倒序编号,取编号为1的行就是分组的最后一行:
SELECT Name, Value FROM ( SELECT Name, Value, ROW_NUMBER() OVER (PARTITION BY Name ORDER BY Id DESC) AS rn FROM TableName ) t WHERE rn = 1;
PARTITION BY Name:按Name分组ORDER BY Id DESC:让每个分组里Id最大的行(最后一行)排在最前面,编号为1- 外层筛选
rn=1的行,得到目标结果
2. 关联子查询法(兼容大多数数据库)
先找出每个Name对应的最大Id(即分组最后一行的Id),再关联原表获取对应Value:
SELECT t.Name, t.Value FROM TableName t INNER JOIN ( SELECT Name, MAX(Id) AS MaxId FROM TableName GROUP BY Name ) g ON t.Name = g.Name AND t.Id = g.MaxId;
3. 低版本MySQL专属写法(MySQL 5.7及以下)
如果你的MySQL不支持窗口函数,可用相关子查询直接筛选:
SELECT Name, Value FROM TableName t WHERE Id = (SELECT MAX(Id) FROM TableName WHERE Name = t.Name);
内容的提问来源于stack exchange,提问作者Eiten
相关产品推荐
相关产品推荐

