Предположим, у меня есть таблица, состоящая из чего-то вроде:
date | A | B | C |
02/01/2020 | 3 | 5 | null |
03/01/2020 | 8 | 3 | null |
04/01/2020 | 3 | 4 | null |
05/01/2020 | 5 | 9 | 3 |
06/01/2020 | 3 | 3 | null |
07/01/2020 | 1 | 2 | null |
08/01/2020 | 5 | 9 | 5 |
Как написать запрос, возвращающий наибольшее количество последовательных нулей в столбце C? В этом случае ответ должен быть 3.
Я пробовал искать в Интернете и задавать вопросы магистрам права, но так и не нашел ответа, который мне помог бы.
С уважением и спасибо за вашу помощь.
Я пробовал такие запросы, как:
SELECT
`C`,
COUNT(*) AS table_name
FROM
(SELECT
`C`,
IFNULL(`C`, 0) AS points
FROM
table_name) AS subquery
GROUP BY
`C`
HAVING
COUNT(*) > 1;
Но это не анализ последовательных нулей, а просто подсчет групп разных значений для столбцов в целом. Я даже не знаю, с чего начать.
Помогите нам помочь вам, отредактируйте свой вопрос, включив в него таблицу создания и вставки примеров данных.
Если я задам вопрос в будущем, я включу таблицу создания/вставки, чтобы помочь респондентам, но Торстен выбил его из парка своим ответом ниже, поэтому я оставлю это на этот случай.
Используйте COUNT OVER
, чтобы получить текущий подсчет значений в C, и используйте его в качестве группового ключа. Затем сгруппируйте по этому ключу, посчитайте нули и возьмите строку результата с максимальным количеством нулей.
Иллюстрация групп:
Полный запрос:
select
count(*) - count(c) as consecutive_nulls
from
(
select
t.*,
count(c) over (order by dt) as grp
from mytable t
)
group by grp
order by consecutive_nulls desc
limit 1;
Сработало просто блестяще. «Пересчет» — это то, с чем я раньше не сталкивался, и его полезно добавить в свой набор инструментов.
Вы пробовали задать чатгпт?