2017-05-23 58 views
1

我的數據庫:PostgreSQL的:一個訂單後返回不同的行BY

SELECT * FROM odds ORDER BY created_at DESC; 

runner_id | value |   created_at   
-----------+-------+---------------------------- 
    365910 |  5 | 2017-03-13 14:29:45.404927 
    365911 | 2.9 | 2017-03-13 14:29:45.404927 
    365912 |  7 | 2017-03-13 14:29:45.404927 
    365910 |  5 | 2017-03-13 14:29:02.654532 
    365911 |  3 | 2017-03-13 14:29:02.654532 
    365912 |  7 | 2017-03-13 14:29:02.654532 
    365910 | 5.5 | 2017-03-13 14:28:22.733787 
    365911 |  3 | 2017-03-13 14:28:22.733787 
    365912 |  7 | 2017-03-13 14:28:22.733787 
    365910 | 5.5 | 2017-03-13 14:25:42.885042 
    365911 |  3 | 2017-03-13 14:25:42.885042 
    365912 | 7.5 | 2017-03-13 14:25:42.885042 
    365913 | 10 | 2017-03-13 14:25:42.885042 
    365910 |  5 | 2017-03-13 14:25:21.842275 
    365911 |  3 | 2017-03-13 14:25:21.842275 
    365912 | 7.5 | 2017-03-13 14:25:21.842275 
    365913 | 10 | 2017-03-13 14:25:21.842275 

我要找的DISTINCT runner_id行,具有最高created_at。這是我想要的結果:

runner_id | value |   created_at   
-----------+-------+---------------------------- 
    365910 |  5 | 2017-03-13 14:29:45.404927 
    365911 | 2.9 | 2017-03-13 14:29:45.404927 
    365912 |  7 | 2017-03-13 14:29:45.404927 
    365913 | 10 | 2017-03-13 14:25:42.885042 

這似乎很容易,但我無法把握它。我開始認爲這是不可能的,因爲ORDER BY是最後發生的事情,我需要SQL來對行進行排序,然後在runner_id上選擇DISTINCT。

回答

0

您的查詢是使用Postgres的分析功能ROW_NUMBER()的理想選擇。您希望保留每個runner_id組記錄中的最新記錄。下面的CTE計算每個邏輯的行數,查詢只保留最新的記錄。

WITH cte AS (
    SELECT runner_id, value, created_at, 
      ROW_NUMBER() OVER (PARTITION BY runner_id ORDER BY created_at DESC) rn 
    FROM odds 
) 
SELECT 
    t.runner_id, 
    t.value, 
    t.created_at 
FROM cte t 
WHERE t.rn = 1 

我們也可以嘗試使用DISTINCT ON這裏:

SELECT DISTINCT ON (runner_id) 
    runner_id, value, created_at 
FROM odds 
ORDER BY runner_id, created_at DESC 
+0

'明顯的()'通常是更快然後利用窗口函數 –

+0

@a_horse_with_no_name我不是太熟悉'DISTINCT ON',但我將不勝感激您的校對我的更新答案。 –

+1

「(..)」部分中的列不會自動成爲選擇列表的一部分,因此您需要爲其添加「runner_id」。 –

相關問題