我有这 2 个表及其插入内容:
create table #JobFailureConfig (
JobId int not null,
JobName varchar(128) not null);
go
insert into #JobFailureConfig values (2, 'CopyOverFileJob');
insert into #JobFailureConfig values (3, 'ExcludeFromWarehouseJob');
go
create table #Job(
id int,
JobId int,
CreateDtTm datetimeoffset,
StatusDtTm datetimeoffset,
StatusName varchar(128));
go
insert into #Job values (47022087, 3, '2020-05-07 18:44:35.7327 -07:00', '2020-05-07 18:44:36.6599 -07:00','Failed');
insert into #Job values (47022092, 3, '2020-05-07 18:44:47.1431 -07:00', '2020-05-07 18:44:47.2599 -07:00','Failed');
insert into #Job values (47022097, 3, '2020-05-07 18:45:36.6888 -07:00', '2020-05-07 18:45:36.8439 -07:00','Failed');
insert into #Job values (47022088, 3, '2020-05-07 18:46:35.7327 -07:00', '2020-05-07 18:47:36.6599 -07:00','Finished');
insert into #Job values (47022087, 3, '2020-05-07 18:44:35.7327 -07:00', '2020-05-13 18:44:36.6599 -07:00','Failed');
insert into #Job values (47022092, 3, '2020-05-07 18:44:47.1431 -07:00', '2020-05-13 18:44:47.2599 -07:00','Failed');
insert into #Job values (98234237, 2, '2020-05-01 18:44:35.7327 -07:00', '2020-05-01 18:44:36.6599 -07:00','Finished');
insert into #Job values (98234238, 2, '2020-05-03 18:44:35.7327 -07:00', '2020-05-03 18:44:36.6599 -07:00','Failed');
insert into #Job values (98234238, 2, '2020-05-03 18:44:35.7327 -07:00', '2020-04-03 18:44:36.6599 -07:00','Failed');
go
我有这个查询按 JobId
对它们进行分区并按 JobId
和 StatusDtTm
对它们进行排序:
select
j.Id,
j.JobId,
jfc.JobName,
j.StatusName,
CreateDtTm = format(cast(CreateDtTm as datetime), 'yyyy-MM-dd HH:mm:ss'),
StatusDtTm = format(cast(StatusDtTm as datetime), 'yyyy-MM-dd HH:mm:ss'),
row_number() over (Partition by j.JobId order by j.JobId, j.StatusDtTm desc) as JobFailureId
from #Job j
join #JobFailureConfig jfc
on j.JobId = jfc.JobId;
go
我只想获取作业上次完成每个作业的行。基本上在上次完成之前获取每个作业的所有记录(以绿色突出显示)。我似乎无法弄清楚要在此处的 where 子句中添加什么以获得突出显示的结果。有人可以帮忙吗?
最佳答案
一种方法是将以下列添加到您的查询中:
count(case when statusname = 'Finished' then 1 end)
over(partition by j.jobid
order by j.StatusDtTm
rows between unbounded preceding and current row) sel
对于突出显示的行,这个新字段 sel
将具有非零值,其中该作业 ID 的当前或以前的 StatusName
具有值“已完成”;否则,该值为零。
只输出高亮记录的完整查询是:
with cte as
(
select
j.Id,
j.JobId,
jfc.JobName,
j.StatusName,
format(cast(CreateDtTm as datetime), 'yyyy-MM-dd HH:mm:ss') as CreateDtTm,
format(cast(StatusDtTm as datetime), 'yyyy-MM-dd HH:mm:ss') as StatusDtTm,
row_number() over (Partition by j.JobId order by j.JobId, j.StatusDtTm desc) as JobFailureId,
count(case when statusname = 'Finished' then 1 end)
over(partition by j.jobid
order by j.StatusDtTm
rows between unbounded preceding and current row) sel
from #Job j
join #JobFailureConfig jfc
on j.JobId = jfc.JobId
)
select Id, JobId, JobName, StatusName, CreateDtTm, StatusDtTm, JobFailureId
from cte
where sel=1
order by jobid, jobfailureid
关于sql - 如何在更改列字符串之前从 SQL 表中获取所有行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61811233/