Посчитайте последовательные числа c в SQL - PullRequest
0 голосов
/ 16 января 2020

В этом сценарии уже существует много вопросов, однако я не могу воспроизвести ответы в моем сценарии.

У меня есть следующий пример набора данных:

ID Number  | Values 
754321       0
754321       0
754321       0
754321       0
754321       1
754321       0
754321       1
754321       0
754321       2
754321       0
754329       3
754329       4
754329       5
754329       6
754329       7
754329       8
754329       9 

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

ID Number  Count of Consecutive 0 Values
754321     4 

Ответы [ 2 ]

1 голос
/ 16 января 2020

Если вы используете версию MySQL, которая не поддерживает оконные функции, вы можете реализовать эту функцию с помощью переменных:

SELECT `ID Number`, MAX(cnt) AS `Max Consecutive 0 Values`
FROM (SELECT `ID Number`, SUM(`Values` = 0) AS cnt
      FROM (SELECT `ID Number`, `Values`,
                   @cnz:= CASE WHEN `Values` != 0 THEN @cnz + 1
                               ELSE @cnz
                          END AS cnz
            FROM data
            CROSS JOIN (SELECT @cnz := 0) init
            ORDER BY date
            ) c
      GROUP BY `ID Number`, cnz) s
GROUP BY `ID Number`

Выход

ID Number   Max Consecutive 0 Values
754321      4
754329      0

Демонстрация по SQLFiddle

1 голос
/ 16 января 2020

Это форма проблемы пробелов и островков. Вы можете назначить каждому 0 группу, посчитав количество ненулевых значений перед ним. Затем агрегировать.

Однако таблицы SQL представляют неупорядоченные наборы. Там нет порядка, если столбец не определяет порядок. Позвольте мне предположить, что у вас есть один. Тогда:

select count(*)
from (select t.*,
             sum(values <> 0) over (partition by idnumber order by <ordering col>) as grp
      from t
     ) t
where values = 0
group by idnumber, grp;
...