Postgres条件/混合排序

时间:2018-09-21 13:23:32

标签: sql postgresql select timestamp sql-order-by

我有一个带有时间戳列的表,像这样:

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

我需要返回记录,以使记录分为两组,第一组是date_time在将来的记录,第二组是过去在date_time的记录。 将来的记录需要按升序排列(即最接近现在的记录排在首位),过去的记录需要按降序排列。

我通过进行两个单独的查询并将结果与​​union all合并来解决了这个问题,但这并不是很有效,我很好奇是否有更好的方法?也许通过对订单使用条件排序?

2 个答案:

答案 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是一个学期。