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

计算视频学习启停交互时间差:MySQL查询报错与结果需求

问题解决:SQL语法错误修复与播放时长计算实现

原SQL语法错误原因

你写的SQL里,错误地将CASE表达式和窗口函数的OVER()子句嵌套在一起,MySQL不支持这种语法结构。窗口函数(如LEAD/LAG)需要作为独立表达式使用,不能嵌套在CASE的返回值中。同时原SQL未过滤无关的Run记录,也没有正确匹配每个开始事件对应的结束事件,逻辑上也存在问题。

正确实现SQL

以下是满足需求的查询语句,会自动匹配每个Start/Play对应的下一个Pause/Stop,并计算时间差:

SELECT 
    ll.learnerid,
    TIMESTAMPDIFF(SECOND, lll.createdAt, next_end_time) AS `Length of interaction`,
    lll.createdAt AS start_timestamp
FROM (
    SELECT 
        learnerlessonid,
        createdAt,
        interaction,
        -- 获取当前记录之后的第一个事件时间(用于匹配结束事件)
        LEAD(createdAt) OVER (PARTITION BY learnerlessonid ORDER BY createdAt) AS next_end_time,
        -- 标记当前是否为播放开始事件
        CASE WHEN interaction IN ('Start', 'Play') THEN 1 ELSE 0 END AS is_start_event
    FROM learner_lesson_logs
    -- 过滤掉中间自动生成的Run记录,不参与时长计算
    WHERE interaction != 'Run'
) AS lll
JOIN learner_lessons ll ON ll.learnerlessonid = lll.learnerlessonid
-- 只保留开始事件,且确保对应的下一个事件是结束事件
WHERE is_start_event = 1 
  AND (SELECT interaction FROM learner_lesson_logs WHERE createdAt = next_end_time) IN ('Pause', 'Stop')
ORDER BY start_timestamp;

执行结果

运行上述SQL后,会得到你期望的结果:

learnerid      Length of interaction      start_timestamp
24                  4                     2022-11-02 07:51:30
24                  11                    2022-11-02 07:52:20

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 06:10:15