如何编写SQL查询以统计连续发生的事件次数?
统计连续事件次数的SQL实现
假设你的事件表结构如下(以用户连续事件为例,可根据实际场景调整字段):
CREATE TABLE event_logs ( user_id INT, event_date DATE, event_type VARCHAR(50) -- 可选,用于区分不同类型事件 );
核心实现逻辑
通过窗口函数计算日期与分组行号的差值,相同差值的行属于同一连续事件组,再对每组统计连续次数。
完整SQL查询语句
SELECT user_id, MIN(event_date) AS start_date, MAX(event_date) AS end_date, COUNT(*) AS consecutive_count -- 连续事件发生次数 FROM ( SELECT user_id, event_date, -- 生成连续事件组的标识:连续日期减去递增行号后结果一致 DATE_SUB(event_date, INTERVAL ROW_NUMBER() OVER (PARTITION BY user_id ORDER BY event_date) DAY) AS group_flag FROM event_logs -- 可选:如果仅统计特定事件类型,添加WHERE条件 -- WHERE event_type = 'target_event' ) AS grouped_events GROUP BY user_id, group_flag ORDER BY user_id, start_date;
关键说明
ROW_NUMBER() OVER (PARTITION BY user_id ORDER BY event_date):按用户分组,对事件日期排序后生成递增行号。DATE_SUB(...):连续的日期减去对应行号后,会得到相同的group_flag,以此识别连续事件区间。- 外层通过
GROUP BY分组统计每组的起止日期和连续次数。
若你的事件时间粒度是小时/分钟,或需要按其他维度分组,只需调整日期函数和窗口函数的分区、排序字段即可。
内容的提问来源于stack exchange,提问作者user2436437
相关产品推荐
相关产品推荐

