【问题标题】:T-SQL Issue using lead or lag使用领先或滞后的 T-SQL 问题
【发布时间】:2018-11-01 17:30:57
【问题描述】:

我有一个包含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 

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

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

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

任何帮助将不胜感激

迈克

【问题讨论】:

  • 您能否展示您的源表架构和一些示例数据

标签: sql-server tsql lag lead


【解决方案1】:

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

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() 替换为您希望的默认值。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-26
    相关资源
    最近更新 更多