我有一个带有时间戳列的表,像这样:
╔═══════╦════════════╦
║ name ║ date_time ║
╠═══════╬════════════╬
║ A ║ 100 ║
║ B ║ 110 ║
║ C ║ 120 ║
║ D ║ 140 ║
║ E ║ 180 ║
║ F ║ 190 ║
╚═══════╩════════════╩
我需要返回记录,以使记录分为两组,第一组是date_time在将来的记录,第二组是过去在date_time的记录。 将来的记录需要按升序排列(即最接近现在的记录排在首位),过去的记录需要按降序排列。
我通过进行两个单独的查询并将结果与union all合并来解决了这个问题,但这并不是很有效,我很好奇是否有更好的方法?也许通过对订单使用条件排序?
答案 0 :(得分:2)
在Postgres中,您可以对布尔值进行排序-false
值位于true
值之前。因此,您可以根据两个表达式进行排序-检查记录是过去还是将来的条件,以及它与当前时间戳的绝对距离:
SELECT *
FROM mytable
ORDER BY date_time < CURRENT_TIMESTAMP,
ABS(EXTRACT(EPOCH FROM CURRENT_TIMESTAMP) -
EXTRACT(EPOCH FROM date_time))
答案 1 :(得分:1)
我将使用三个排序键来完成此操作:
order by (date_time < current_timestamp),
(case when date_time < current_timestamp then date_time end) desc,
date_time asc;
Here是一个学期。