Гость
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Условная сортировка / 7 сообщений из 7, страница 1 из 1
03.07.2018, 17:20
    #39669008
kbl
kbl
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Условная сортировка
Есть таблица заказов. Заказ может быть как и обычным, так и связанным с другим. (заказ туда - обратно). Поле link_id содержит id связанного заказа, поле is_back указывает на то прямой заказ или обратный.
Код: sql
1.
select * from orders order  by   order_time



id order_time is_backlink_id1 7:00 nullnull2 8:00 null43 9:00 null74 10:00 true25 11:00 nullnull6 12:00 nullnull7 13:00 true38 14:00 nullnull

Нужно сохранив общий порядок сортировки поместить обратные после прямых.
id order_time is_backlink_id1 7:00 nullnull2 8:00 null44 10:00 true23 9:00 null77 13:00 true35 11:00 nullnull6 12:00 nullnull8 14:00 nullnull

Такое вообще можно сделать?
...
Рейтинг: 0 / 0
03.07.2018, 23:19
    #39669150
Flashpoke
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Условная сортировка
Код: sql
1.
2.
3.
SELECT *
FROM orders
ORDER BY (CASE WHEN link_id IS NOT NULL AND is_back THEN link_id ELSE id END), order_time;
...
Рейтинг: 0 / 0
04.07.2018, 01:31
    #39669184
kbl
kbl
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Условная сортировка
Спасибо, но не помогло. Я задачу несколько упростил для общего понимания. В реальности id и link_id это случайно генерируемые bigint. И предложенный вариант действительно собирает рядом связанные объекты, но сортировка по времени остальных при это нарушается.
...
Рейтинг: 0 / 0
04.07.2018, 04:38
    #39669201
Щукина Анна
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Условная сортировка
kbl,

LEFT JOIN таблицы саму на себя + сортировка по COALESCE("левоприсоединенная копия таблицы".order_time, "основня копия таблицы".order_time)
...
Рейтинг: 0 / 0
04.07.2018, 04:45
    #39669202
Щукина Анна
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Условная сортировка
Щукина Аннаkbl,

LEFT JOIN таблицы саму на себя + сортировка по COALESCE("левоприсоединенная копия таблицы".order_time, "основня копия таблицы".order_time) скорее всего - сортировка по Case всё же будет...
...
Рейтинг: 0 / 0
04.07.2018, 05:54
    #39669206
Щукина Анна
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Условная сортировка
kbl,
<== Немного "кривого" кода
Код: 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.
-- Ваши тестовые данные
with
  orders (id, order_time, is_back,link_id) as 
    (
      select * 
	    from (
		       values 
                 (1, '07:00', null,null),
                 (2, '08:00', null,4),
                 (3, '09:00', null,7),
                 (4, '10:00', 'true',2),
                 (5, '11:00', null,null),
                 (6, '12:00', null,null),
                 (7, '13:00', 'true',3),
                 (8, '14:00', null,null)
             ) v(a,b,c,d)
    )
-- Возможный вариант решения:
select o_b.*
  from orders o_b
  left join orders o_l
    on o_b.id = o_l.link_id
   and o_l.is_back is null
 order by coalesce(o_l.order_time, o_b.order_time), o_b.order_time

Проверка работоспособности решения
...
Рейтинг: 0 / 0
04.07.2018, 05:56
    #39669207
Щукина Анна
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Условная сортировка
kbl,

если ваши данные могут иметь более сложную схему взаимосвязей (к примеру - "дерево отношений", а не банальное - "прямая операция - кривая операция"), то и запрос должен быть более сложным, использующим рекурсивное предложение WITH.
...
Рейтинг: 0 / 0
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Условная сортировка / 7 сообщений из 7, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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