如何通过非唯一visit_id与event_time计算总耗时?SQL报错求助
解决SQL计算访客总耗时的错误问题
错误原因
SQL语法限制了窗口函数(如LAG())不能直接嵌套在聚合函数(如SUM())内部执行,这就是你的语句触发报错的原因。
修正后的SQL写法
可以先通过子查询或CTE(公共表表达式)计算出每个visit_id下相邻事件的时间差,再对时间差求和:
方法1:使用CTE
WITH visit_time_diffs AS ( SELECT visit_id, DATEDIFF(second, LAG(event_time) OVER (PARTITION BY visit_id ORDER BY event_time), event_time) AS time_diff FROM events_over ) SELECT visit_id, SUM(time_diff) AS total_time_spent FROM visit_time_diffs GROUP BY visit_id;
方法2:使用子查询
SELECT visit_id, SUM(time_diff) AS total_time_spent FROM ( SELECT visit_id, DATEDIFF(second, LAG(event_time) OVER (PARTITION BY visit_id ORDER BY event_time), event_time) AS time_diff FROM events_over ) AS subquery GROUP BY visit_id;
说明
- 第一步先按
visit_id分组、event_time排序,用LAG()获取当前事件的前序事件时间,计算出相邻事件的时间差time_diff - 第二步对每个
visit_id的time_diff求和,得到该访客的总耗时 - 每个
visit_id的第一个事件对应的time_diff为NULL,SUM()会自动忽略该值,符合业务逻辑(第一个事件没有前序事件,不存在时间差)
内容的提问来源于stack exchange,提问作者KristiLuna
相关产品推荐
相关产品推荐

