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

SQL查询需求:获取各JobId对应最新状态的唯一记录

获取每个JobId的最新状态记录

嘿,我来帮你搞定这个问题!你当前写的SQL:

select distinct JobId, Status, CreatedDate from Jobs order by CreatedDate desc

没法得到你想要的结果,原因很简单:distinct会保留所有**(JobId, Status, CreatedDate)组合不同**的记录,哪怕是同一个JobId,只要Status或CreatedDate不一样,都会被留下来。排序只是调整了输出顺序,但并没有筛选出每个JobId的最新那条记录。

两种靠谱的解法

方法1:用窗口函数(推荐,清晰易读)

用ROW_NUMBER()窗口函数给每个JobId分组内的记录按日期倒序排名,然后取排名第一的那条:

WITH RankedJobs AS (
    SELECT 
        JobId, 
        Status, 
        CreatedDate,
        -- 按JobId分组,每组内按CreatedDate从新到旧排名
        ROW_NUMBER() OVER (PARTITION BY JobId ORDER BY CreatedDate DESC) AS row_rank
    FROM Jobs
)
SELECT JobId, Status
FROM RankedJobs
WHERE row_rank = 1;

这个方法的优势是逻辑直观,而且如果后续需要扩展(比如取最新的N条记录),改起来也很方便。

方法2:子查询关联(兼容老版本SQL)

如果你的数据库不支持窗口函数(比如一些旧版MySQL),可以先用子查询找出每个JobId的最新创建日期,再关联原表匹配对应的状态:

SELECT j.JobId, j.Status
FROM Jobs j
INNER JOIN (
    -- 先算出每个JobId的最晚创建日期
    SELECT JobId, MAX(CreatedDate) AS latest_created_date
    FROM Jobs
    GROUP BY JobId
) latest_jobs 
ON j.JobId = latest_jobs.JobId AND j.CreatedDate = latest_jobs.latest_created_date;

结果验证

用你提供的示例数据,这两种方法都会返回你期望的结果:

JobId Status
1 sent
2 sent

小提醒

如果同一个JobId存在多条创建日期完全相同的记录(比如同一时间更新了两次状态),ROW_NUMBER()会随机返回其中一条;要是想把这些同日期的记录都保留,可以把ROW_NUMBER()换成RANK()或者DENSE_RANK()。

内容的提问来源于stack exchange,提问作者Diya

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 08:29:37