MySQL计数按顺序改变

时间:2015-09-06 03:13:40

标签: mysql count

我正试图找到一种方法来计算值在有序列表中更改的次数。给定A, B, A, A, B, C, C之类的序列,将有4个更改,忽略第一个。

我需要的是在COUNT(GROUP BY x)之后应用的ORDER BY y命令,但这不是有效的语法。有没有一种简单的方法可以在纯MySQL中实现这一点,或者我最好用Python迭代?

该表将按日期字段排序。例如:

+------------+-------+
| Date       | Value |
+------------+-------+
| 2015-09-01 | A     |
| 2015-09-02 | B     | (change)
| 2015-09-03 | A     | (change)
| 2015-09-05 | A     |
| 2015-09-06 | B     | (change)
| 2015-09-07 | C     | (change)
| 2015-09-08 | C     |
+------------+-------+

1 个答案:

答案 0 :(得分:0)

<强>计划

  
      
  • 按日期排序
  •   
  • 计算滞后变量超过排序
  •   
  • 计算变化(与滞后变量比较)
  •   
  • 取max(更改)并减去一(for the first transition ..)
  •   

<强>查询

set @chgs := 0;
set @lag  := null;

select max(chgs) - 1 as num_changes
from
(
  select `Date`, `Value`,
  @chgs := if(@lag = `Value`, @chgs, 
                if(@lag := `Value`, @chgs + 1, @chgs + 1)) as chgs
  from sequence
  order by `Date`
) calc
;

<强>输出

+-------------+
| num_changes |
+-------------+
|           4 |
+-------------+

sqlfiddle