powered by simpleCommunicator - 2.0.29     © 2024 Programmizd 02
Map
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Помогите найти решение с помощью оконных функций
3 сообщений из 3, страница 1 из 1
Помогите найти решение с помощью оконных функций
    #40138406
Гох Елена
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Обучаюсь на "Степике" SQL в СУБД темы форума. Зацепила задача на поиск идущих три и более раз подряд повторов числа, есть решение с подзапросами для трех подряд, захотелось найти универсальное для любого n подряд, нагуглив идею, нашла решение с переменными. Поскольку прохожу ещё и оконные функции, хочется получить решение и сними. Не получается. Нужна идея. Заранее благодарна даже за просмотр темы.

Скрипт для создания таблицы:

DROP TABLE IF EXISTS Numbers;
CREATE TABLE Numbers
(
id INT AUTO_INCREMENT PRIMARY KEY,
num INT
);

TRUNCATE Numbers;
INSERT INTO Numbers (num)
VALUES (1),
(3),
(2),
(2),
(1),
(4),
(4),
(3),
(2),
(5),
(5),
(5),
(5),
(1),
(1),
(1),
(2),
(8),
(2),
(2);

Решение для любого n c переменными:

SELECT DISTINCT num
FROM(
SELECT num
, @counter := IF(@prev = num, @counter + 1, 1) AS how_many
, @prev := num
FROM Numbers y
, (SELECT @counter:=1, @prev:=NULL) vars
) s
WHERE how_many >= 3

С "окошками" дальше флажков не получается, сумма их дает и для идущей через перерыв двойки тоже больше трех на приложенных данных:

SELECT id, num
, (LAG(num) over () = num or LEAD(num) over () = num) as flag
FROM Numbers

Надо как бы разбить на партиции в случае смены числа, но как?
2024-01-24_22-50-14.png
...
Рейтинг: 0 / 0
Помогите найти решение с помощью оконных функций
    #40138407
CerebroSQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гох Елена [игнорируется] 

Например так
Код: SQL
1.
2.
3.
4.
5.
6.
7.
8.
9.
select max(rn), num
  from (
select row_number() over (partition by num) "rn",
       num
 from
     Numbers
) a
where rn > 3
group by num
...
Рейтинг: 0 / 0
Помогите найти решение с помощью оконных функций
    #40138410
Гох Елена
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
CerebroSQL [игнорируется] 

Спасибо! Но это решило задачу - схлопывается "двойка", а она - с прерыванием идёт.
Повозилась ещё, да, ROW_NUMBER не уйти, но вот только если применить после флажков.
В общем, получается громоздко, и на мой взгляд с переменными нагляднее.

select num
from(
select id, num, fl
, id - row_number() over (partition by num order by id) r
from
(
SELECT id, num
, (LAG(num) over () = num or LEAD(num) over () = num) fl
FROM Numbers
) s
where fl=1
) ss
group by 1
having count(*) >= 3 and count(distinct(r))=1
...
Рейтинг: 0 / 0
3 сообщений из 3, страница 1 из 1
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Помогите найти решение с помощью оконных функций
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]