我有一个表,其中有列EVENT_ACTION
和TIMESTAMP
;在EVENT_ACTION
列中,有两个可能的值225和226。
225
代表start_time
,226
代表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
您可以看到我迷路了:-)。
任何帮助将不胜感激
迈克
答案 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
替换为无前导记录时的默认值。