powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Написание нетривиального запроса
11 сообщений из 11, страница 1 из 1
Написание нетривиального запроса
    #39494162
serhio_sv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Привет

Оч нужна помощь в написании нетривиального запроса

Есть таблица формата ниже
Нужно оставить только те стоки для столбца Имя, в которых Номер идет по порядку (123), но не обязательно подряд
В нашем случае это строки 123 для а и 689 для b

Может кто-то сказать как решить такую задачу?
Конкретный запрос не обязателен, нужно направление куда копать, т к с Postgre пока не очень

nn Имя Номер
1 a 1
2 a 2
3 a 3
4 a 2
5 a 3
6 b 1
7 b 3
8 b 2
9 b 3
10 b 1
...
Рейтинг: 0 / 0
Написание нетривиального запроса
    #39494183
Фотография Щукина Анна
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
serhio_sv,

Почему для "а" взяты именно строки 1,2,3, а не 1,4,5 к примеру? Или не оба набора сразу?
...
Рейтинг: 0 / 0
Написание нетривиального запроса
    #39494206
serhio_sv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
1,4,5 - тоже подходит. т е подходят оба набора сразу. как-то об этом не подумал

Но главное найти первое совпадение
...
Рейтинг: 0 / 0
Написание нетривиального запроса
    #39494207
p2.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
serhio_sv,

with recursive + distinct on
...
Рейтинг: 0 / 0
Написание нетривиального запроса
    #39494305
Фотография Щукина Анна
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
p2.,

анкорные узлы как определять будете? с циклами бороться как планируете?
рекурсив WITH - это больше для чистых деревьев, то есть для связных ацикличных графов. А тут больше похоже на несвязанный граф произвольной структуру, допускающий циклы и множественность путей из одной вершины в другую.
...
Рейтинг: 0 / 0
Написание нетривиального запроса
    #39494348
982183
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
serhio_svПривет

Оч нужна помощь в написании нетривиального запроса

Есть таблица формата ниже
Нужно оставить только те стоки для столбца Имя, в которых Номер идет по порядку (123), но не обязательно подряд
В нашем случае это строки 123 для а и 689 для b


Т.Е оставить все строки, у которых в предшествующей строке nn меньше текущей
ИЛИ в следующей строке nn больше текущей.
И имена равны

Без SQL элементарная задача.
Как на SQL - не знаю.
...
Рейтинг: 0 / 0
Написание нетривиального запроса
    #39494373
p2.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Щукина Аннаанкорные узлы как определять будете?=1

Щукина Аннас циклами бороться как планируете?<
...
Рейтинг: 0 / 0
Написание нетривиального запроса
    #39494495
Фотография Щукина Анна
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
p2.,

ТС нигде не сказал, что последовательности начинаются именно с 1...
...
Рейтинг: 0 / 0
Написание нетривиального запроса
    #39494589
p2.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Щукина Аннаначинаются именно с 1...Сделать мин() не проблема. Но автор также не сказал, что последовательность состоит именно из трех элементов. При такой постановке задача не имеет смысла, так как любая отдельная строка сама себе последовательна.
...
Рейтинг: 0 / 0
Написание нетривиального запроса
    #39494615
LeXa NalBat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
982183Т.Е оставить все строки, у которых в предшествующей строке nn меньше текущей ИЛИ в следующей строке nn больше текущей. И имена равны
отличная идея!

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
with t1(nn, name, number) as (
    values
    (1, 'a', 1),
    (2, 'a', 2),
    (3, 'a', 3),
    (4, 'a', 2),
    (5, 'a', 3),
    (6, 'b', 1),
    (7, 'b', 3),
    (8, 'b', 2),
    (9, 'b', 3),
    (10, 'b', 1)
)
select t1_prev, t1, t1_next from t1
    join t1 as t1_prev on t1.name = t1_prev.name and t1_prev.number + 1 = t1.number and t1_prev.nn < t1.nn
    join t1 as t1_next on t1.name = t1_next.name and t1.number + 1 = t1_next.number and t1.nn < t1_next.nn
;


Код: plaintext
1.
2.
3.
4.
5.
6.
 t1_prev |   t1    | t1_next 
---------+---------+---------
 (1,a,1) | (2,a,2) | (3,a,3)
 (1,a,1) | (4,a,2) | (5,a,3)
 (1,a,1) | (2,a,2) | (5,a,3)
 (6,b,1) | (8,b,2) | (9,b,3)
(4 строки)
...
Рейтинг: 0 / 0
Написание нетривиального запроса
    #39494983
982183
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Наврал я.
не nn, а "Номер"
nn у него ключ.
...
Рейтинг: 0 / 0
11 сообщений из 11, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Написание нетривиального запроса
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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