SQL Server:从两张带外键的表获取每个作业的最新版本行
查询每个作业的最新执行版本记录
你当前的SQL存在逻辑问题:窗口函数里按作业ID(j.job_id)排序,无法区分版本的新旧。要获取每个作业的最新版本,需按版本号(job_version_number)倒序排列,再筛选每个分组内行号为1的记录。
修正后的SQL语句
WITH 排名版本 AS ( SELECT ROW_NUMBER() OVER(PARTITION BY j.job_id ORDER BY jv.job_version_number DESC) AS 行号, jv.*, j.* FROM jobs_internal.job_versions jv JOIN jobs_internal.jobs j ON jv.job_id = j.job_id ) SELECT * FROM 排名版本 WHERE 行号 = 1;
逻辑说明
- 用
WITH子句创建临时结果集排名版本,通过PARTITION BY j.job_id按作业ID分组 - 每个分组内按
job_version_number(作业版本号)降序排序,最新版本会被标记为行号 = 1 - 最后筛选行号为1的记录,即可得到每个作业的最新执行版本
示例结果(对应你的数据)
执行后将得到以下两条记录(每个作业的最新版本):
| 行号 | 作业ID | 作业版本号 | 作业ID | 作业名称 | 删除请求时间 | 是否系统作业 | 计划开始时间 | 计划结束时间 | 计划间隔类型 | 计划间隔次数 | 是否启用 | 描述 | 最后作业执行ID |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 1 | 522C48C9-198F-40F8-BB30-16556C55DAC7 | 125 | 522C48C9-198F-40F8-BB30-16556C55DAC7 | 全库执行 | NULL | 0 | 0001-01-01 00:00:00.0000000 | 9999-12-31 11:59:59.0000000 | 一次性 | 1 | 0 | 在所有数据库上执行语句 | NULL |
| 1 | 44228D08-5AD4-4B74-A200-6BCCC10E6B97 | 2 | 44228D08-5AD4-4B74-A200-6BCCC10E6B97 | 部分批量加载执行 | NULL | 0 | 0001-01-01 00:00:00.0000000 | 9999-12-31 11:59:59.0000000 | 一次性 | 1 | 0 | 在远程数据库中执行部分批量加载操作 | NULL |
内容的提问来源于stack exchange,提问作者Boyan Mihnev
相关产品推荐
相关产品推荐

