使用超前或滞后的T-SQL问题

时间:2018-11-01 17:30:58

标签: sql-server tsql lag lead

我有一个表,其中有列EVENT_ACTIONTIMESTAMP;在EVENT_ACTION列中,有两个可能的值225和226。

225代表start_time226代表end_time;由于它们位于两行中,因此我尝试使用LAGLEAD并遇到一些问题。

这是我到目前为止所拥有的; MRDF列是我的唯一ID:

SELECT  
    f.EVENT_ACTION ,
    (f.TIMESTAMP) AS starttime, 
    LEAD(f.TIMESTAMP) OVER (ORDER BY f.MRDF) AS endtime 
FROM  
    dbo.flext f 
WHERE 
    EVENT_ACTION IN (225,226) 
ORDER BY 
    MRDF, EVENT_ACTION 

这就是我所得到的:现在正在获得我想的下一行的时间戳:

Query Results

我上一次EVENT_ACTION 255的值为空。我打算将其放置到临时表中,仅使用EVENT_ACTION 225

您可以看到我迷路了:-)。

任何帮助将不胜感激

迈克

1 个答案:

答案 0 :(得分:2)

我认为您想将f.TIMESTAMP用作ORDER BY的{​​{1}}。我认为您的查询应该看起来像这样:

LEAD()

但是,在最后226条记录的结束时间内,这仍将为NULL。因此,可以针对这种情况向SELECT f.EVENT_ACTION , (f.TIMESTAMP) AS starttime, LEAD(f.TIMESTAMP) OVER (ORDER BY f.TIMESTAMP ASC) AS endtime FROM dbo.flext f WHERE EVENT_ACTION IN (225,226) ORDER BY MRDF, EVENT_ACTION 函数添加默认值。语法为:

LEAD()

使用此语法,您的LEAD ( scalar_expression [ ,offset ] , [ default ] ) 将变为:

LEAD()

您可以将LEAD(f.TIMESTAMP, 1, GETDATE()) OVER (ORDER BY f.TIMESTAMP ASC) AS endtime 替换为无前导记录时的默认值。