You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 07:55:32