Postgres условная / смешанная сортировка - PullRequest
0 голосов
/ 21 сентября 2018

У меня есть таблица со столбцом метки времени, что-то вроде этого:

╔═══════╦════════════╦
║ name  ║ date_time  ║ 
╠═══════╬════════════╬
║  A    ║     100    ║
║  B    ║     110    ║
║  C    ║     120    ║
║  D    ║     140    ║
║  E    ║     180    ║
║  F    ║     190    ║
╚═══════╩════════════╩

Мне нужно вернуть записи так, чтобы записи были в двух группах, записи, где date_time находится в будущем, являютсяпервая группа, и записи, где date_time находится в прошлом, являются второй группой.Записи в будущем должны быть отсортированы в порядке возрастания (т. Е. Ближайший к текущему моменту должен быть отсортирован первым), а записи в прошлом должны быть отсортированы в порядке убывания.

Мне удалось решить эту проблему, сделав дваотдельные запросы и объединение результатов с union all, но это не очень эффективно, и мне было любопытно узнать, есть ли лучший подход?Может быть, с помощью условной сортировки заказа по?

Ответы [ 2 ]

0 голосов
/ 21 сентября 2018

Я бы сделал это, используя три ключа сортировки:

order by (date_time < current_timestamp),
         (case when date_time < current_timestamp then date_time end) desc,
         date_time asc;

Здесь - реекстер.

0 голосов
/ 21 сентября 2018

В Postgres вы можете сортировать логические значения - false значения предшествуют true значениям.Таким образом, вы можете сортировать по двум выражениям - условие, которое проверяет, находится ли запись в прошлом или будущем, и абсолютное расстояние от нее до текущей отметки времени:

SELECT *
FROM   mytable
ORDER BY date_time < CURRENT_TIMESTAMP, 
         ABS(EXTRACT(EPOCH FROM CURRENT_TIMESTAMP) -
             EXTRACT(EPOCH FROM date_time))
...