You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在MySQL中统计连续两行数值差值不为0的次数?

解决MySQL中统计连续行value变化次数的问题

我来帮你搞定这个需求!要计算连续两行value差值不为0的次数(也就是你说的Change计数器),核心思路是先把数据按时间排序,再对比相邻行的value值,最后统计变化的次数。下面是具体的实现步骤和代码:

步骤拆解

  1. 先给数据按时间排序
    原始数据的TIMESTAMP是乱序的,所以必须先按TIMESTAMP升序排列,这样才能保证我们对比的是时间上连续的两行,而不是表中存储的物理顺序。

  2. 获取上一行的value值
    使用MySQL的LAG()窗口函数,这个函数可以帮我们获取当前行的上一行对应的value值,这样就能和当前行的value做对比了。

  3. 标记变化的行
    用CASE语句判断:如果当前行的value和上一行的value不相等,就标记为1(表示发生了变化),否则标记为0。注意第一行没有上一行,所以我们要排除它,不参与计数。

  4. 统计总变化次数
    把所有标记为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排序,得到顺序如下:

TIMESTAMPvalue
2021-01-27 00:25:07.8020000006300
2021-01-27 00:25:14.6510000006300
2021-01-27 00:25:23.264000000150
2021-01-27 00:25:31.048000000150
2021-01-27 00:25:38.978000000450
2021-01-27 00:26:01.016000000240
2021-01-27 00:34:05.2560000001000
2021-01-27 00:34:15.918000000800
2021-01-27 00:34:46.4270000001000

对比每一行和上一行的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.28 13:52:31