簡體   English   中英

Postgres條件/混合排序

[英]Postgres conditional / mixed sorting

我有一個帶有時間戳列的表,如下所示:

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

我需要返回記錄,以使記錄分為兩類,date_time在將來的記錄是第一組,而date_time在過去的記錄是第二組。 將來的記錄需要按升序排序(即最接近現在的記錄排在第一位),而過去的記錄則需要按降序排序。

我設法通過進行兩個單獨的查詢並將結果與​​union all合並在一起來解決此問題,但這並不是很有效,我很好奇是否有更好的方法? 也許通過對訂單使用條件排序?

在Postgres中,您可以對布爾值進行排序- false值先於true值。 因此,您可以根據兩個表達式進行排序-檢查記錄是過去還是將來的條件,以及它與當前時間戳的絕對距離:

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

我將使用三個排序鍵來執行此操作:

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

是一個學期。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM