[英]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.