SQL分区窗口下计算两行时间差:会话内反馈与启动事件间隔计算
问题原因
你原来的逻辑直接固定取每个会话的第一条feedbackProvided记录,没有和首个measurementStarted的时间做匹配过滤,也没有取时间最近的符合要求的记录,所以不符合需求。
调整方案
可以按以下逻辑修改SQL:
- 先提取每个会话的首个
measurementStarted事件的时间 - 关联同会话的所有
feedbackProvided事件,过滤出满足「feedbackProvided时间早于首个measurementStarted且时间差在3分钟内」的记录 - 每个会话取过滤后时间最新的
feedbackProvided,计算和measurementStarted的时间差即可
调整后代码
WITH first_measurement AS ( -- 提取每个会话的首个measurementStarted事件 SELECT session, recordedAt AS started_at FROM ( SELECT session, recordedAt, ROW_NUMBER() OVER(PARTITION BY session ORDER BY recordedAt ASC) AS rn FROM events WHERE type = 'measurementStarted' ) t WHERE rn = 1 ), valid_feedback AS ( -- 关联符合3分钟时间窗口的feedbackProvided事件,按时间倒排取最近的 SELECT f.session, f.recordedAt AS feedback_at, m.started_at, ROW_NUMBER() OVER(PARTITION BY f.session ORDER BY f.recordedAt DESC) AS rn FROM events f JOIN first_measurement m ON f.session = m.session AND f.type = 'feedbackProvided' AND f.recordedAt < m.started_at AND date_diff('minute', f.recordedAt, m.started_at) < 3 ) -- 计算最终时间差 SELECT session, feedback_at, started_at, date_diff('millisecond', feedback_at, started_at) AS diff_ms FROM valid_feedback WHERE rn = 1
逻辑说明
- 针对你给出的示例数据,代码会匹配到时间为
2021-08-17T14:28:17.12+03:00的feedbackProvided事件(比你示例里提到的14:28:15的记录更近),计算得到的时间差约为5317毫秒。 - 如果某会话没有符合3分钟窗口的
feedbackProvided记录,关联后不会出现在结果里,自动忽略。
内容的提问来源于stack exchange,提问作者Josh
相关产品推荐
相关产品推荐

