Гость
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Написание нетривиального запроса / 11 сообщений из 11, страница 1 из 1
24.07.2017, 19:26
    #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
24.07.2017, 19:54
    #39494183
Щукина Анна
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Написание нетривиального запроса
serhio_sv,

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

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

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

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

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

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


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

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

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

ТС нигде не сказал, что последовательности начинаются именно с 1...
...
Рейтинг: 0 / 0
25.07.2017, 14:22
    #39494589
p2.
p2.
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Написание нетривиального запроса
Щукина Аннаначинаются именно с 1...Сделать мин() не проблема. Но автор также не сказал, что последовательность состоит именно из трех элементов. При такой постановке задача не имеет смысла, так как любая отдельная строка сама себе последовательна.
...
Рейтинг: 0 / 0
25.07.2017, 14:35
    #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
26.07.2017, 04:40
    #39494983
982183
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Написание нетривиального запроса
Наврал я.
не nn, а "Номер"
nn у него ключ.
...
Рейтинг: 0 / 0
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Написание нетривиального запроса / 11 сообщений из 11, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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