2015-10-29 4 views
1

Используя MySQL, я пытаюсь найти наибольшее количество последовательных строк в таблице на основе значения. Для простоты, моя таблица выглядит следующим образом:MySQL: найдите максимальные последовательные строки в таблице на основе значения

+----+-------+ 
| ID | VALUE | 
+----+-------+ 
| 1 | A  | 
| 2 | B  | 
| 3 | A  | 
| 4 | A  | 
| 5 | B  | 
| 6 | B  | 
| 7 | A  | 
| 8 | A  | 
| 9 | A  | 
| 10 | B  | 
+----+-------+ 

В этом примере, если бы я хотел наибольшее количество последовательных строк для «A», я хотел бы получить 3. Для «B», я хотел бы получить 2. Было бы предпочтительным даже возвращение набора результатов из числа последовательных строк для «А». Я новичок в SQL, поэтому намеки будут также оценены. Какие-либо предложения?

ответ

4

Вы можете сделать это с помощью переменных:

SELECT VALUE, MAX(cnt) AS maxCount 
FROM (
    SELECT VALUE, COUNT(grp) AS cnt 
    FROM (
    SELECT ID, VALUE, rn - rnByVal AS grp 
    FROM (
     SELECT ID, VALUE, 
      @rn := @rn + 1 AS rn, 
      @rnByVal := IF (@val = VALUE, 
          IF (@val := VALUE, @rnByVal + 1, @rnByVal + 1), 
          IF (@val := VALUE, 1, 1)) AS rnByVal 
     FROM mytable 
     CROSS JOIN (SELECT @rn := 0, @rnByVal := 0, @val := '') AS vars 
     ORDER BY ID) AS t 
    ) AS s 
    GROUP BY VALUE, grp) AS u 
GROUP BY VALUE 

Переменные @rn и @rnByVal используются для того, чтобы имитировать ROW_NUMBER функцию окна, в настоящее время не доступны в MySQL. Вторая переменная (@rnByVal) выполняет счет VALUEразделы.

С помощью @rn - @rnByVal во внешнем запросе мы можем рассчитать поле grp, которое идентифицирует острова последовательных строк, имеющих одинаковые VALUE. Выполняя GROUP BY по адресу VALUE, grp, мы можем рассчитать численность этих островов и, наконец, в самом внешнем запросе, получить максимальное количество населения за VALUE.

Demo here

+0

Большое спасибо! Это было сложнее, чем я думал, но это, безусловно, решило мою проблему. –

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