如何用SQL查询各Risk分组下最大Date对应的所有数据行?
嘿,这个需求挺常见的,我给你分享几种靠谱的实现方案,适配不同的SQL方言,你可以根据自己用的数据库来选:
方案1:子查询关联(兼容性拉满)
这种方法几乎所有关系型数据库都支持,思路很直接:先找出每个Risk对应的最大Date,再用这个结果和原表关联,筛选出符合条件的行。
SELECT t.* FROM your_table t INNER JOIN ( SELECT Risk, MAX(Date) AS max_date FROM your_table GROUP BY Risk ) sub ON t.Risk = sub.Risk AND t.Date = sub.max_date ORDER BY t.Risk;
简单解释下:子查询先按Risk分组,拿到每个组的最新日期;然后原表和子查询通过Risk和日期匹配,就能捞到每个Risk最新日期下的所有数据行。
方案2:窗口函数(推荐,更简洁)
如果你的数据库支持窗口函数(比如MySQL 8.0+、PostgreSQL、SQL Server、Oracle这些),用RANK()来实现会更直观,而且代码更简洁。
SELECT Risk, Date, Value FROM ( SELECT *, RANK() OVER (PARTITION BY Risk ORDER BY Date DESC) AS rn FROM your_table ) t WHERE rn = 1 ORDER BY Risk;
这里的逻辑是:
PARTITION BY Risk:把数据按Risk分成不同的组ORDER BY Date DESC:每个组里按日期倒序排列,最新的日期排最前面RANK():给每个组里的行排名,同一Risk下最大日期的所有行都会被标记为1
最后筛选出排名为1的行,就是你要的结果啦。
⚠️ 注意:别用ROW_NUMBER()代替RANK(),不然同一日期的行只会保留其中一条,不符合你要所有行的需求。
方案3:CTE公共表表达式(可读性更强)
和窗口函数的逻辑一样,只是把子查询换成CTE,代码结构更清晰,维护起来更方便:
WITH ranked_risk AS ( SELECT *, RANK() OVER (PARTITION BY Risk ORDER BY Date DESC) AS rn FROM your_table ) SELECT Risk, Date, Value FROM ranked_risk WHERE rn = 1 ORDER BY Risk;
最后记得把代码里的your_table换成你实际使用的表名哦~
内容的提问来源于stack exchange,提问作者mikizas
相关产品推荐
相关产品推荐

