2015-09-06 3 views
3

Я пытаюсь найти способ подсчета количества изменений значения в упорядоченном списке. Учитывая последовательность, такую ​​как A, B, A, A, B, C, C, было бы 4 изменения, игнорируя первый.Количество MySQL изменяется в последовательности

Что мне нужно, это что-то вроде команды 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  | 
+------------+-------+ 
+0

последовательность подразумевает заказ. существует ли идентификатор или упорядоченное поле, которое определяет эту последовательность. также добавьте полное определение таблицы – amdixon

+0

, это можно сделать полностью с помощью mysql. Но, как @amdixon заявил ↑ вам нужно показать больше – Drew

ответ

0

план

  • Сортировать по Дате
  • переменной задержки высчитывает над расчетом изменением заказа
  • (по сравнению с лаг переменного)
  • тека макс (изменения) и вычесть один для (для первого перехода ..)

запрос

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

+0

Это работает, и это очень быстро. Благодарю. – Rachie

Смежные вопросы