SQL行间时间差计算:消除首行NULL值并修正结果错位问题
修正SQL连续行时间差的错位与首行NULL问题
你想要的是每一行显示当前记录到下一条不同URL记录的时间差,但原查询用了LAG函数(取上一行数据),导致差值错位,首行因为没有上一行而返回NULL。咱们直接调整逻辑就能解决这个问题:
原问题分析
你的原查询用LAG(record_timestamp)计算的是当前行 - 上一行的时间差,所以这个差值会对应到当前行;但你期望的是下一行 - 当前行的差值显示在当前行,这时候应该用LEAD函数(取下一行数据),同时可以简化掉多余的JOIN操作。
修正后的SQL
SELECT ID, url_rec AS URL, record_timestamp AS Record_Time, -- 用LEAD获取下一行的时间戳,计算与当前行的时间差并格式化 CONVERT(VARCHAR(8), LEAD(record_timestamp, 1) OVER (ORDER BY ID) - record_timestamp, 108) AS Difference FROM ( SELECT ID, url_rec, record_timestamp, -- 获取下一行的URL,用于过滤连续相同的URL记录 LEAD(url_rec, 1) OVER (ORDER BY ID) AS next_url FROM raw_activity_log ) AS filtered_logs -- 只保留与下一行URL不同的记录(最后一行如果没有下一行,也会被保留) WHERE url_rec <> ISNULL(next_url, '') ORDER BY ID;
修正后的预期结果
| ID | URL | Record_Time | Difference |
|---|---|---|---|
| 1 | https://sabezyessent.teramind.co/#/welcome | 2022-05-09 09:44:22.000 | 00:03:20 |
| 2 | https://sabezyessent.teramind.co/#/report/4 | 2022-05-09 09:47:42.000 | 23:59:55 |
| 3 | https://sabezyessent.teramind.co/#/clock | 2022-05-09 09:47:37.000 | 00:00:08 |
| 4 | https://sabezyessent.teramind.co/#/manage/users/profile/2 | 2022-05-09 09:47:45.000 | NULL |
额外优化(可选)
如果最后一行的NULL看着不舒服,可以用ISNULL替换成默认值,比如:
ISNULL(CONVERT(VARCHAR(8), LEAD(record_timestamp, 1) OVER (ORDER BY ID) - record_timestamp, 108), '00:00:00') AS Difference
内容的提问来源于stack exchange,提问作者Rakesh Thakre
相关产品推荐
相关产品推荐

