powered by simpleCommunicator - 2.0.28     © 2024 Programmizd 02
Map
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Получить следующую строку таблицы с составным первичным по предыдущей строке
9 сообщений из 9, страница 1 из 1
Получить следующую строку таблицы с составным первичным по предыдущей строке
    #40136234
andrey2185
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Привет, как получить следующую строку таблицы с составным первичным ключом по первичному ключу предыдущей записи? Составной ключ может быть любой, не только из интов.

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
drop table testobject6;

create table testobject6(
	pk1 int8,
	pk2 int8,
	pk3 int8,
	pk4 int8,
	pk5 int8,
	PRIMARY KEY(pk1, pk2, pk3, pk4, pk5)
);

insert into testobject6 
	(pk1, pk2, pk3, pk4, pk5) 
values 
	(1,2,3,4,5),
	(3,1,4,0,7),
	(2,9,5,5,6),
	(1,8,8,5,7),
	(1,9,0,0,8);

select * from testobject6;

select * 
  from testobject6
 where ... ??? -- допустим следующую за (2,9,5,5,6)
 limit 1;
...
Рейтинг: 0 / 0
Получить следующую строку таблицы с составным первичным по предыдущей строке
    #40136242
andrey2185
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
такое ... и генерить сложно, и лишние движения


Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
select t.lead_pk1
	,t.lead_pk2
	,t.lead_pk3
	,t.lead_pk4
	,t.lead_pk5
  from (
    select 
		pk1, pk2, pk3, pk4, pk5
		,LEAD (pk1,1) OVER (ORDER BY pk1, pk2, pk3, pk4, pk5) lead_pk1
		,LEAD (pk2,1) OVER (ORDER BY pk1, pk2, pk3, pk4, pk5) lead_pk2
		,LEAD (pk3,1) OVER (ORDER BY pk1, pk2, pk3, pk4, pk5) lead_pk3
		,LEAD (pk4,1) OVER (ORDER BY pk1, pk2, pk3, pk4, pk5) lead_pk4
		,LEAD (pk5,1) OVER (ORDER BY pk1, pk2, pk3, pk4, pk5) lead_pk5
	  from testobject6
  ) t
 where t.pk1 = 1 and t.pk2 = 2 and t.pk3 = 3 and t.pk4 = 4 and t.pk5 = 5
;



это, вроде, получше, но тоже не универсальное решение, может кто-то решал уже такое?

Код: sql
1.
2.
3.
4.
5.
select pk1, pk2, pk3, pk4, pk5
  from testobject6
 where pk1::text || pk2::text || pk3::text || pk4::text || pk5::text > '12345'
 order by pk1, pk2, pk3, pk4, pk5
 limit 1;
...
Рейтинг: 0 / 0
Получить следующую строку таблицы с составным первичным по предыдущей строке
    #40136245
andrey2185
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: sql
1.
2.
3.
4.
5.
select pk1, pk2, pk3, pk4, pk5
  from testobject6
 where pk1::text || '/' || pk2::text || '/' || pk3::text || '/' || pk4::text || '/' || pk5::text > '1/2/3/4/5'
 order by pk1, pk2, pk3, pk4, pk5
 limit 1;
...
Рейтинг: 0 / 0
Получить следующую строку таблицы с составным первичным по предыдущей строке
    #40136246
andrey2185
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
andrey2185
Код: sql
1.
2.
3.
4.
5.
select pk1, pk2, pk3, pk4, pk5
  from testobject6
 where pk1::text || '/' || pk2::text || '/' || pk3::text || '/' || pk4::text || '/' || pk5::text > '1/2/3/4/5'
 order by pk1, pk2, pk3, pk4, pk5
 limit 1;



но это не безопасно, например, если pk могут содержать '/'
...
Рейтинг: 0 / 0
Получить следующую строку таблицы с составным первичным по предыдущей строке
    #40136247
Фотография Щукина Анна
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andrey2185,

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
select *
  from (
         select * 
           from t
          order by ....
          limit 2
       ) v
 order by ...
 limit 1 offset 1
...
Рейтинг: 0 / 0
Получить следующую строку таблицы с составным первичным по предыдущей строке
    #40136254
andrey2185
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Щукина Анна,

не соображу куда здесь условия для начальной строки поставить?

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
select *
  from (
         select * 
           from t
           -- t.pk1 = 1 and t.pk2 = 2 and t.pk3 = 3 and t.pk4 = 4 and t.pk5 = 5  -- так не сработает
          order by ....
          limit 2
       ) v
 order by ...
 limit 1 offset 1
 
 
...
Рейтинг: 0 / 0
Получить следующую строку таблицы с составным первичным по предыдущей строке
    #40136283
delphinotes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Для ленивых: все поля в одну строку можно собрать через to_json(*)
Но если потом надо разобрать обратно, то лучше первый вариант, только окно (ключевое слово WINDOW) можно описать отдельно один раз, чтобы не повторяться.
...
Рейтинг: 0 / 0
Получить следующую строку таблицы с составным первичным по предыдущей строке
    #40136326
bochkov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: sql
1.
2.
3.
4.
select * from t
where t.pk1 >= 1 and t.pk2 >= 2 and t.pk3 >= 3 and t.pk4 >= 4 and t.pk5 >= 5
order by pk1,pk2,pk3,pk4,pk5
limit 1 offset 1
...
Рейтинг: 0 / 0
Получить следующую строку таблицы с составным первичным по предыдущей строке
    #40136645
andrey2185
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: sql
1.
2.
3.
4.
5.
SELECT * 
FROM testobject6
WHERE (pk1, pk2, pk3, pk4, pk5) > (2,9,5,5,6)
ORDER BY pk1, pk2, pk3, pk4, pk5
LIMIT 1;
...
Рейтинг: 0 / 0
9 сообщений из 9, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Получить следующую строку таблицы с составным первичным по предыдущей строке
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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