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

如何编写SQL计算Event A与后续非A事件的时间差

计算每个Event A与紧随其后非A事件的时间差SQL实现

通用方案(支持窗口函数的数据库:MySQL 8+、PostgreSQL、BigQuery、SQL Server等)

利用LEAD()窗口函数可以高效获取每个A事件之后的第一个非A事件时间,代码如下:

SELECT 
    id,
    next_non_a_time - time AS duration
FROM (
    SELECT 
        id,
        event,
        time,
        -- 按用户分组、时间排序,捕获后续第一个非A事件的时间
        LEAD(CASE WHEN event != 'A' THEN time END) OVER (
            PARTITION BY id 
            ORDER BY time
        ) AS next_non_a_time
    FROM your_table_name -- 替换为你的表名
) filtered
WHERE 
    event = 'A'
    AND next_non_a_time IS NOT NULL; -- 排除无后续非A事件的A

逻辑说明:

  • 内层子查询通过LEAD()窗口函数,仅当后续事件为非A时才返回其时间,按用户分组、时间升序遍历事件
  • 外层仅保留事件为A的行,且确保存在后续非A事件,最后计算时间差

兼容旧版数据库方案(无窗口函数:MySQL 5.x等)

如果数据库不支持窗口函数,可使用关联子查询实现:

SELECT 
    t1.id,
    t2.time - t1.time AS duration
FROM your_table_name t1
JOIN your_table_name t2 
    ON t1.id = t2.id
    AND t2.time > t1.time
    AND t2.event != 'A'
WHERE 
    t1.event = 'A'
    -- 确保t2是t1之后的第一个非A事件(中间无其他事件)
    AND NOT EXISTS (
        SELECT 1 
        FROM your_table_name t3
        WHERE t3.id = t1.id
        AND t3.time > t1.time
        AND t3.time < t2.time
    )
ORDER BY t1.id, t1.time;

逻辑说明:

  • 通过JOIN找到当前A事件之后的所有非A事件
  • 用NOT EXISTS过滤掉中间存在其他事件的情况,确保只保留第一个非A事件
  • 计算两个事件的时间差

内容的提问来源于stack exchange,提问作者Qiang Super

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 04:05:28