You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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;

修正后的预期结果

IDURLRecord_TimeDifference
1https://sabezyessent.teramind.co/#/welcome2022-05-09 09:44:22.00000:03:20
2https://sabezyessent.teramind.co/#/report/42022-05-09 09:47:42.00023:59:55
3https://sabezyessent.teramind.co/#/clock2022-05-09 09:47:37.00000:00:08
4https://sabezyessent.teramind.co/#/manage/users/profile/22022-05-09 09:47:45.000NULL

额外优化(可选)

如果最后一行的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.27 15:27:41