Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 需要在不使用交叉/外部应用的情况下修改查询_Sql_Sql Server_Tsql_Sql Server 2012 - Fatal编程技术网

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