sql - 如何在更改列字符串之前从 SQL 表中获取所有行?

标签 sql sql-server tsql

我有这 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 对它们进行分区并按 JobIdStatusDtTm 对它们进行排序:

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

enter image description here

我只想获取作业上次完成每个作业的行。基本上在上次完成之前获取每个作业的所有记录(以绿色突出显示)。我似乎无法弄清楚要在此处的 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/

相关文章:

javascript - 将 .sql 文件转换为 .json 或 javascript 对象或 Sequelize 模型文件的最佳方法

mysql - SQL - 没有销售的产品

mysql - MARIADB - 如果未提供默认值,SQL 能否将 NULL 转换为空字符串?

sql-server - CROSS APPLY 与 GROUP BY 一起返回逗号分隔值

sql - 在sql server management studio 2014中重命名数据库名称

mysql - INSERT 当前日期和特定时间 MySQL

sql-server - 如何从 SQL Server 的同一行中选择特定列

sql-server - SQL Server : deleting FIELSTREAM files and num_unprocessed_items

c# - 一张表或多张表,数据只有一列发生变化

sql - 是否可以使用 T-SQL 脚本(不是 SQL Server 代理计划创建向导)创建作业计划?