如何筛选连续出现多次的记录并统计连续次数
筛选连续重复记录并统计出现次数
嘿,这个需求我之前也碰到过!要搞定数据表中连续重复记录的分组统计,核心就是把连续相同的记录归为同一组,然后统计每组的数量就行。我分两种常见场景给你详细说:
场景1:用SQL处理数据库表
假设你的数据表叫sequence_table,里面有两个关键列:
value:存储你要统计的序列值(比如x、y)order_col:用来保证序列顺序的列(比如自增ID、时间戳,必须有这个才能判断“连续”!)
核心思路
用两个ROW_NUMBER()窗口函数生成的编号做差,得到一个分组标识——连续相同的value会得到相同的标识,这样就能把它们归为一组。
完整SQL代码
WITH grouped_data AS ( SELECT value, order_col, -- 生成全局行号(按序列顺序) ROW_NUMBER() OVER (ORDER BY order_col) AS global_row, -- 按value分组生成组内行号 ROW_NUMBER() OVER (PARTITION BY value ORDER BY order_col) AS value_row, -- 两个行号的差作为分组ID,连续相同value的差不变 ROW_NUMBER() OVER (ORDER BY order_col) - ROW_NUMBER() OVER (PARTITION BY value ORDER BY order_col) AS group_id FROM sequence_table ) SELECT value, COUNT(*) AS occurrence_count FROM grouped_data GROUP BY group_id, value -- 按原序列顺序输出结果 ORDER BY MIN(order_col);
对应你的例子验证
如果你的序列是x x x y y x x y,order_col是1到8,那么group_id会是:
- 前3个x:
1-1=0、2-2=0、3-3=0→ 同一组 - 接下来2个y:
4-1=3、5-2=3→ 同一组 - 再2个x:
6-4=2、7-5=2→ 同一组 - 最后1个y:
8-3=5→ 单独一组
统计后就得到你要的结果:x 3、y 2、x 2、y 1。
场景2:用Python处理列表/内存数据
如果你的序列是在Python内存中(比如列表),用itertools.groupby可以一行搞定:
from itertools import groupby # 你的序列 sequence = ['x', 'x', 'x', 'y', 'y', 'x', 'x', 'y'] # 分组统计 result = [(key, len(list(group))) for key, group in groupby(sequence)] print(result) # 输出:[('x', 3), ('y', 2), ('x', 2), ('y', 1)]
这个方法会自动把连续相同的元素归为一组,直接统计每组长度就行,非常简洁!
内容的提问来源于stack exchange,提问作者beginneeeeer2021
相关产品推荐
相关产品推荐

