求助:如何获取同组重复记录中最新的Usage字段值
解决方法:获取每组最新记录的Usage值
你原来的SQL问题在于:将Usage加入GROUP BY后,数据库会把不同Usage值的行视为不同分组,所以会返回所有行;而如果不加入Usage,直接在SELECT里引用它,不符合SQL的分组聚合规则(非聚合列必须出现在GROUP BY中)。
下面提供两种可靠的解决方式:
方法1:使用窗口函数(推荐,适用于支持SQL:2003及以上的数据库,如SQL Server、MySQL 8+、PostgreSQL等)
利用ROW_NUMBER()窗口函数,按Name和Color分组,对每组内的行按Entry降序排序,标记出每组的第一条(即Entry最大的记录),再筛选出这些记录:
WITH RankedEntries AS ( SELECT Entry, Name, Color, Usage, ROW_NUMBER() OVER (PARTITION BY Name, Color ORDER BY Entry DESC) AS rn FROM ColorUsage ) SELECT Name, Color, Usage FROM RankedEntries WHERE rn = 1;
解释:
PARTITION BY Name, Color:将数据按Name和Color分成不同的组ORDER BY Entry DESC:每组内按Entry从大到小排序,最新的记录排在第一位rn = 1:筛选出每组的第一条记录,也就是最新的那条
方法2:子查询+关联查询(兼容旧版数据库)
先通过子查询获取每组Name, Color对应的最大Entry,再将这个结果和原表关联,获取对应的Usage值:
SELECT cu.Name, cu.Color, cu.Usage FROM ColorUsage cu INNER JOIN ( SELECT Name, Color, MAX(Entry) AS MaxEntry FROM ColorUsage GROUP BY Name, Color ) max_entries ON cu.Name = max_entries.Name AND cu.Color = max_entries.Color AND cu.Entry = max_entries.MaxEntry;
解释:
- 子查询
max_entries:计算每组Name, Color的最大Entry值 - 内连接原表:通过
Name, Color, Entry匹配,找到对应最大Entry的那条记录的Usage
这两种方法都能得到你想要的结果:
A, Red, 1.5 B, Blue, 0.6
内容的提问来源于stack exchange,提问作者Rohad Bokhar
相关产品推荐
相关产品推荐

