MySQL:如何筛选连续错误次数≥3的ID并获取起止时间
解决MySQL统计连续错误序列的方案
假设你的数据表结构如下(可根据实际表名、字段名调整):
CREATE TABLE event_log ( id VARCHAR(10), type VARCHAR(20), `timestamp` DATETIME );
核心思路
利用窗口函数ROW_NUMBER()标记连续同类型的分组:
- 对每个
id,按时间戳排序生成全局行号; - 对每个
id+type的组合,按时间戳排序生成组内行号; - 用全局行号减去组内行号,得到的差值相同的记录即为连续同类型的序列。
完整SQL语句
WITH grouped_events AS ( SELECT id, type, `timestamp`, -- 生成分组标识:连续同id同type的记录会有相同的group_id ROW_NUMBER() OVER (PARTITION BY id ORDER BY `timestamp`) - ROW_NUMBER() OVER (PARTITION BY id, type ORDER BY `timestamp`) AS group_id FROM event_log ), sequence_stats AS ( SELECT id, type, COUNT(*) AS consecutive_count, MIN(`timestamp`) AS start_at, MAX(`timestamp`) AS end_at FROM grouped_events WHERE type = 'error' -- 筛选错误类型 GROUP BY id, type, group_id HAVING consecutive_count >= 3 -- 保留连续出现3次及以上的序列 ) SELECT id, consecutive_count, start_at, end_at FROM sequence_stats ORDER BY id, start_at;
代码解释
- CTE
grouped_events:通过两个ROW_NUMBER()的差值,将连续的同ID同错误类型记录归为同一group_id; - CTE
sequence_stats:按id、type、group_id分组,统计每组的连续次数,同时取该序列的起始和结束时间,筛选出次数≥3的序列; - 最终查询返回符合条件的ID、连续次数、起始和结束时间。
适配你的示例
如果你的示例数据中ID A有4次连续错误,ID C有3次连续错误,执行上述SQL后会返回:
| id | consecutive_count | start_at | end_at |
|---|---|---|---|
| A | 4 | [序列起始时间] | [序列结束时间] |
| C | 3 | [序列起始时间] | [序列结束时间] |
内容的提问来源于stack exchange,提问作者user22132557
相关产品推荐
相关产品推荐

