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
。