Подсчет максимального числа повторений подряд с помощью sql (laravel / mysql) - PullRequest
1 голос
/ 11 марта 2020

У меня есть данные, которые выглядят так:

enter image description here

Можно ли считать, используя id в качестве порядка столбцов (AS C), что максимальное значение 0 вхождение в строке? Таким образом, ожидаемый результат будет 0 был 3 раза подряд; или если мы посчитаем значение 1 - 2 раза подряд.

Хорошо в php Я мог бы предвидеть все значения и считать случаи, но я ищу решение сделать это в базе данных.

С уважением, Марк

1 Ответ

1 голос
/ 11 марта 2020

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

Если id s всегда увеличивается на 1 (без пробелов):

select sl, max(no_rec)
from (
    select t.*, count(*) over(partition by sl, id - rn) no_rec
    from (
        select t.*, row_number() over(partition by sl order by id) rn
        from mytable t
    ) t
) t
group by sl

В противном случае мы можем сгенерировать поддельный автоинкрементный идентификатор с row_number():

select sl, max(no_rec)
from (
    select t.*, count(*) over(partition by sl, rn1 - rn2) no_rec
    from (
        select
            t.*,
            row_number() over(order by id) rn
            row_number() over(partition by sl order by id) rn
        from mytable t
    ) t
) t
group by sl

Примечание: для этого используются оконные функции, которые требуют MySQL 8,0. В более ранних версиях решить эту проблему гораздо сложнее.

...