如何在MySQL中统计连续两行数值差值不为0的次数?
解决MySQL中统计连续行value变化次数的问题
我来帮你搞定这个需求!要计算连续两行value差值不为0的次数(也就是你说的Change计数器),核心思路是先把数据按时间排序,再对比相邻行的value值,最后统计变化的次数。下面是具体的实现步骤和代码:
步骤拆解
先给数据按时间排序
原始数据的TIMESTAMP是乱序的,所以必须先按TIMESTAMP升序排列,这样才能保证我们对比的是时间上连续的两行,而不是表中存储的物理顺序。获取上一行的value值
使用MySQL的LAG()窗口函数,这个函数可以帮我们获取当前行的上一行对应的value值,这样就能和当前行的value做对比了。标记变化的行
用CASE语句判断:如果当前行的value和上一行的value不相等,就标记为1(表示发生了变化),否则标记为0。注意第一行没有上一行,所以我们要排除它,不参与计数。统计总变化次数
把所有标记为1的行加起来,就是最终的Change值。
完整SQL代码
SELECT SUM(change_flag) AS Change FROM ( SELECT value, -- 获取上一行的value值,按TIMESTAMP排序 LAG(value) OVER (ORDER BY TIMESTAMP) AS prev_value, -- 判断当前行和上一行的value是否不同,是则标记1,否则0 CASE WHEN value != LAG(value) OVER (ORDER BY TIMESTAMP) THEN 1 ELSE 0 END AS change_flag FROM your_table_name -- 这里替换成你的实际表名 ) AS subquery -- 排除第一行(没有上一行的情况) WHERE prev_value IS NOT NULL;
验证结果
我们先把原始数据按TIMESTAMP排序,得到顺序如下:
| TIMESTAMP | value |
|---|---|
| 2021-01-27 00:25:07.802000000 | 6300 |
| 2021-01-27 00:25:14.651000000 | 6300 |
| 2021-01-27 00:25:23.264000000 | 150 |
| 2021-01-27 00:25:31.048000000 | 150 |
| 2021-01-27 00:25:38.978000000 | 450 |
| 2021-01-27 00:26:01.016000000 | 240 |
| 2021-01-27 00:34:05.256000000 | 1000 |
| 2021-01-27 00:34:15.918000000 | 800 |
| 2021-01-27 00:34:46.427000000 | 1000 |
对比每一行和上一行的value:
- 第2行和第1行相同 → 标记0
- 第3行和第2行不同 → 标记1
- 第4行和第3行相同 → 标记0
- 第5行和第4行不同 → 标记1
- 第6行和第5行不同 → 标记1
- 第7行和第6行不同 → 标记1
- 第8行和第7行不同 → 标记1
- 第9行和第8行不同 → 标记1
把所有1加起来:1+1+1+1+1+1=6,正好符合你期望的Change值。
内容的提问来源于stack exchange,提问作者royalewithcheese
相关产品推荐
相关产品推荐

