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
相关产品推荐
相关产品推荐

