如何用SQL统计前序事件与后续事件的连续发生次数?
解决SQL统计连续事件对次数的问题
你的问题出在两个核心点上:
- LEAD函数的窗口排序用了
ORDER BY sale item,这会把相同商品归在一起,彻底破坏了原始的事件发生顺序(必须按id排序,因为id递增代表事件的先后顺序) - 直接分组的逻辑错误,需要先获取正确的连续事件对,再进行统计
正确的SQL写法
WITH event_pairs AS ( SELECT `Sale Item` AS `First Event`, LEAD(`Sale Item`, 1) OVER (ORDER BY id) AS `Second Event` FROM your_table_name -- 替换成你的实际表名 ) SELECT `First Event`, `Second Event`, COUNT(*) AS `Count` FROM event_pairs WHERE `Second Event` IS NOT NULL -- 排除最后一行(无后续事件的行) GROUP BY `First Event`, `Second Event`;
代码逻辑说明
- 构建事件对:通过CTE子查询
event_pairs,用LEAD函数按id顺序获取每个商品对应的下一个商品,得到所有连续的事件组合。 - 过滤无效行:最后一行的
Second Event会是NULL(没有后续事件),直接过滤掉这部分无效数据。 - 分组统计次数:按
First Event和Second Event的组合分组,统计每对连续事件出现的次数。
执行后就能得到你期望的结果:
| First Event | Second Event | Count |
|---|---|---|
| Apple | Banana | 2 |
| Banana | Apple | 1 |
| Apple | Orange | 1 |
| Orange | Apple | 1 |
内容的提问来源于stack exchange,提问作者Isaac Speelman
相关产品推荐
相关产品推荐

