Sql 需要在不使用交叉/外部应用的情况下修改查询
我需要知道准备就绪状态和下一个准备就绪或有纸状态之间的时间间隔,未知状态除外。未知我需要跳过。 结果应该如下所示: 这是我的查询,但我不喜欢使用交叉/外部应用。在性能和速度方面,我需要您的建议,如何修改此查询Sql 需要在不使用交叉/外部应用的情况下修改查询,sql,sql-server,tsql,sql-server-2012,Sql,Sql Server,Tsql,Sql Server 2012,我需要知道准备就绪状态和下一个准备就绪或有纸状态之间的时间间隔,未知状态除外。未知我需要跳过。 结果应该如下所示: 这是我的查询,但我不喜欢使用交叉/外部应用。在性能和速度方面,我需要您的建议,如何修改此查询 create table PrinterData( Dt DateTime not null, Status nvarchar(50) not null ) insert into PrinterData values ('05.24.2019 00:00:00
create table PrinterData(
Dt DateTime not null,
Status nvarchar(50) not null
)
insert into PrinterData
values
('05.24.2019 00:00:00', 'READY'),
('05.24.2019 00:01:00', 'READY'),
('05.24.2019 00:02:00', 'NO PAPER'),
('05.24.2019 00:03:00', 'UNKNOWN'),
('05.24.2019 00:04:00', 'UNKNOWN'),
('05.24.2019 00:05:00', 'READY'),
('05.24.2019 00:06:00', 'READY'),
('05.24.2019 00:07:00', 'READY'),
('05.24.2019 00:08:00', 'NO PAPER'),
('05.24.2019 00:09:00', 'UNKNOWN'),
('05.24.2019 00:10:00', 'HAS PAPER'),
('05.24.2019 00:11:00', 'NO PAPER')
使用lead()
函数
select a.Dt, a.Status, b.Dt as Dt_Next_Status, b.Status as Next_Status, DATEDIFF(SECOND, a.Dt, b.Dt) as Diff from PrinterData a
outer apply
(
select top 1 Dt, Status from PrinterData where Dt > a.Dt and Status not in ('UNKNOWN', 'NO PAPER')
) b
where a.Status = 'NO PAPER'
您可以使用left join和row_number()完成此操作
select *,datediff(SECOND,dt,nexttime) as diff from
(
select *,lead(dt) over(order by dt) as nexttime,lead(status) over(order by dt) as nextstatus
from PrinterData
where Status<>'UNKNOWN'
)A where status='NO PAPER'
Dt Status nexttime nextstatus diff
24/05/2019 00:02:00 NO PAPER 24/05/2019 00:05:00 READY 180
24/05/2019 00:08:00 NO PAPER 24/05/2019 00:10:00 HAS PAPER 120
24/05/2019 00:11:00 NO PAPER
with cte as
(
select a.Dt, a.Status, b.Dt as Dt_Next_Status, b.Status as Next_Status,
DATEDIFF(SECOND, a.Dt, b.Dt) as Diff,
row_number()over(partition by a.DT order by b.Dt) rn
from PrinterData a
left join
(
select Dt, Status from PrinterData where Status not in ('UNKNOWN', 'NO PAPER')
) b on b.Dt > a.Dt
where a.Status = 'NO PAPER'
)
select * from cte where rn=1