首页 > 解决方案 > 使用领先或滞后的 T-SQL 问题

问题描述

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

225代表start_time226代表end_time; 因为它们位于两个不同的行中,所以我正在尝试使用LAG或遇到LEAD一些问题。

这是我到目前为止所拥有的;该列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 

这就是我得到的:它现在正在获取下一行的时间戳,就像我想的那样:

查询结果

我的最后一个 EVENT_ACTION 255 得到了一个空值。我打算把它放到一个临时表中,只取 EVENT_ACTION 225

如您所见,我迷路了:-)。

任何帮助,将不胜感激

麦克风

标签: sql-servertsqllaglead

解决方案


我想你想f.TIMESTAMP用作你的ORDER BYfor LEAD()。我认为您的查询应该看起来更像这样:

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 

但是,这仍然会为您的最后 226 条记录的结束时间留下 NULL。LEAD()因此,您可以针对这种情况为函数添加默认值。语法是:

LEAD ( scalar_expression [ ,offset ] , [ default ] ) 

使用此语法,您LEAD()将变为:

LEAD(f.TIMESTAMP, 1, GETDATE()) OVER (ORDER BY f.TIMESTAMP ASC) AS endtime

GETDATE()当没有前导记录时,您可以将默认值替换为您想要的任何值。


推荐阅读