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

SQL实现每个客户相邻会话结束到新会话开始的时间差计算

原查询问题点

  • 语法错误:LAG(end_time) 字段定义后缺少逗号,会直接执行报错
  • 未处理空值:用户首条会话调用LAG取上一行结束时间时返回空,没有按需求替换为0
  • 格式不匹配:原逻辑计算的是分钟差值,和期望的时分秒间隔格式不符

修正后的查询方案

方案1(适配支持SEC_TO_TIME的引擎,如Hive/Spark SQL/MySQL)

SELECT  
    user_id,
    conversation_id,
    start_time,
    end_time,
    CASE
        WHEN LAG(unix_timestamp(end_time)) OVER (PARTITION BY user_id ORDER BY start_time) IS NULL
        THEN '0'
        ELSE SEC_TO_TIME(unix_timestamp(start_time) - LAG(unix_timestamp(end_time)) OVER (PARTITION BY user_id ORDER BY start_time))
    END AS time_between_end_newstart
FROM mt_data
ORDER BY user_id, start_time

方案2(通用兼容版,无SEC_TO_TIME也可运行)

SELECT  
    user_id,
    conversation_id,
    start_time,
    end_time,
    CASE
        WHEN diff_sec IS NULL THEN '0'
        ELSE CONCAT(
            FLOOR(diff_sec / 3600), ':',
            LPAD(FLOOR((diff_sec % 3600) / 60), 2, '0'), ':',
            LPAD(diff_sec % 60, 2, '0')
        )
    END AS time_between_end_newstart
FROM (
    SELECT
        user_id,
        conversation_id,
        start_time,
        end_time,
        unix_timestamp(start_time) - LAG(unix_timestamp(end_time)) OVER (PARTITION BY user_id ORDER BY start_time) AS diff_sec
    FROM mt_data
) t
ORDER BY user_id, start_time

以上查询针对你的样本数据可直接输出期望结果,同用户会话会按start_time排序计算间隔,首条/仅一条会话自动返回0,间隔自动转为时分秒格式。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 01:36:07