sql-server - 使用领先或滞后的 T-SQL 问题
问题描述
我有一个包含列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
如您所见,我迷路了:-)。
任何帮助,将不胜感激
麦克风
解决方案
我想你想f.TIMESTAMP
用作你的ORDER BY
for 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()
当没有前导记录时,您可以将默认值替换为您想要的任何值。
推荐阅读
- php - 如何根据日期和发件人对邮件进行分组?
- python - 在列表中索引 Python 双端队列
- go - 未找到 webrtc.PeerConnection 中的 OnNegotiationNeeded 事件(pion golang)。但是在官方文档中它表明它就在那里
- javascript - readFile 返回未定义
- sql - SQL Pivot 计数不完整和完整
- css - 带引导程序的复杂网格
- java - 如何继续将新记录附加到文本文件而不替换旧记录(Java)
- javascript - Wordpress:从搜索结果页面中删除简码
- docker - /usr/bin/env: 'python': 没有这样的文件或目录
- python - SMOTE 不起作用时的罕见事件分类模型