PostgreSQL:在ORDER BY之后返回不同的行

PostgreSQL:在ORDER BY之后返回不同的行,postgresql,Postgresql,我的数据库: 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

我的数据库:

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
我正在寻找不同的runner\u id行,它们的创建值最高。这就是我想要的结果:

 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对行进行排序,然后选择DISTINCT on runner\u id。

您的查询是使用Postgres的分析函数
行号()
的好选择。您希望保留每个
runner\u 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:

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

您的查询很适合使用Postgres的分析函数
行号()
。您希望保留每个
runner\u 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:

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

distinct on()
通常比使用window更快functions@a_horse_with_no_name我不太熟悉
上的DISTINCT ON
,但我希望您能校对我的最新答案。ON
(…)
部分中的列不会自动成为选择列表的一部分,因此,您需要向它添加
runner\u id
distinct on()
通常比使用window更快functions@a_horse_with_no_name我不太熟悉
上的DISTINCT ON
,但我希望您能校对我的最新答案。ON
(…)
部分中的列不会自动成为选择列表的一部分,因此,您需要向其添加
runner\u id