如何在sql语句中获取两行之间的差异

时间:2014-04-23 22:22:39

标签: sql sql-server-2012 ssms

select distinct 
    shipperinf_coilid, max(PilerInf_CreateDate), max(ShipperInf_CreateDate)
from 
    tblL3SendProductionData
where 
    ShipperInf_CoilId not in (select distinct shipperinf_coilid 
                              from table_2 
                              where orderinf_ordernumber like 'b%') 
    and pilerinf_createdate != '1900-01-01 00:00:00.000'
group by  
    shipperinf_coilid
order by 
    max(PilerInf_CreateDate)

上述查询返回一个过程中的线圈列表及其开始日期和结束日期。我试图找到一种方法来找出线圈的结束日期和下一个线圈的开始日期之间的差异,以查看将另一个线圈加载到过程中花费了多少时间。例如,第1行的结束日期可以说是2013-01-01 07:00:00.000,第2行的开始日期是2013-01-01 07:01:00.000。我将在该特定行中寻找的结果集是1.

我知道我需要做一些事情来加入表格本身并添加到行中,但所需的语法和逻辑思维过程正在暗示我。谢谢你的帮助!

1 个答案:

答案 0 :(得分:0)

好消息是,您在SQL Server 2012上引入了LEAD()LAG() - 让您的任务变得非常轻松。 LEAD()获取当前行并将其与下一行进行比较。 LAG()反其道而行之。

这是我放在一起的一个简单例子:

create table #results (id int, startDate datetime, endDate datetime)

insert into #results
select  1, cast('10/1/2012' as datetime), cast('12/1/2012' as datetime)
insert into #results
select  1, cast('12/15/2012' as datetime), cast('12/31/2012' as datetime)
insert into #results
select  1, cast('2/1/2013' as datetime), cast('12/1/2013' as datetime)

select  id, startDate, endDate,
        DATEDIFF(day, endDate, LEAD(startDate) OVER (ORDER BY id)) DaysUntilNextCoil,
        DATEDIFF(day, startDate, LAG(endDate) OVER (ORDER BY id)) DaysSincePreviousCoil
from #results

drop table #results