如何在MySQL中统计相邻相同值的记录数量
统计MySQL数据表中相邻相同值的记录数量
现有数据表
| id | status |
|---|---|
| 01 | open |
| 02 | close |
| 03 | close |
| 04 | close |
| 05 | open |
| 06 | open |
| 07 | open |
| 08 | close |
| 09 | open |
| 10 | close |
需求
- 统计相邻相同
status值的记录数量 - 期望结果格式:
| status | number |
|---|---|
| open | 1 |
| close | 3 |
| open | 3 |
| close | 1 |
| open | 1 |
| close | 1 |
解决方案
使用MySQL窗口函数标记分组后统计:
WITH grouped_data AS ( SELECT id, status, SUM(CASE WHEN status != LAG(status) OVER (ORDER BY id) THEN 1 ELSE 0 END) OVER (ORDER BY id) AS group_id FROM your_table_name -- 替换为你的实际表名 ) SELECT status, COUNT(*) AS number FROM grouped_data GROUP BY group_id, status ORDER BY MIN(id);
逻辑说明
LAG(status) OVER (ORDER BY id):按id排序后,获取当前记录的上一条status值,保证顺序与原数据一致。- 通过
CASE语句判断当前status是否与上一条不同,不同则标记为1,否则0;再用SUM()累加生成分组IDgroup_id,每段连续相同的status会被分到同一个组。 - 最后按
group_id和status分组统计记录数,按分组的最小id排序,确保结果顺序符合原数据的相邻逻辑。
内容的提问来源于stack exchange,提问作者Game Vui
相关产品推荐
相关产品推荐

