|
Помогите найти решение с помощью оконных функций
#40138406
Ссылка:
Ссылка на сообщение:
Ссылка с названием темы:
Ссылка на профиль пользователя:
Ссылка на вложение:
|
||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
#18+
Обучаюсь на "Степике" 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 Надо как бы разбить на партиции в случае смены числа, но как? ... |
||||||||||||||||
:
Нравится:
Не нравится:
|
||||||||||||||||
24.01.2024, 22:56 |
|
Помогите найти решение с помощью оконных функций
|
|||
---|---|---|---|
#18+
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 ... |
|||
:
Нравится:
Не нравится:
|
|||
27.01.2024, 11:54 |
|
|
start [/forum/topic.php?fid=47&fpage=1&tid=2186922]: |
0ms |
get settings: |
12ms |
get forum list: |
6ms |
check forum access: |
1ms |
check topic access: |
1ms |
track hit: |
34ms |
get topic data: |
4ms |
get forum data: |
1ms |
get page messages: |
70ms |
get tp. blocked users: |
1ms |
others: | 357ms |
total: | 487ms |
0 / 0 |