如何获取Postgresql中的前10个值?


256

我有一个简单的问题:

我有一个postgresql数据库:Scores(score integer)

我如何最快获得最高的10分?

更新:

我将多次进行此查询,并寻求最快的解决方案。


6
-1:到目前为止你做了什么?为什么那还不够好?什么是Postgres版本?哪里explain analyze
mys 2012年

Answers:


372

为此,您可以使用限制

select *
from scores
order by score desc
limit 10

如果性能很重要(什么时候不重要;-),则寻找得分指数。


从8.4版开始,您还可以使用标准(SQL:2008fetch first

select *
from scores
order by score desc
fetch first 10 rows only

正如@Raphvanns指出的那样,这将为您提供first 10 rows字面意义。要删除重复的值,必须选择distinct行,例如

select distinct *
from scores
order by score desc
fetch first 10 rows only

SQL小提琴


2
fetch first X rows only这是我一直在寻找的答案-谢谢您!
Mass Dot Net

35

好像你正在寻找ORDER BYDESC结束以便与LIMIT子句:

SELECT
 *
FROM
  scores
ORDER BY score DESC
LIMIT 10

当然SELECT *可能会严重影响性能,因此请谨慎使用。


3

请注意,如果在前10个值中有联系,则只会获得前10行,而不是提供了答案的前10个。例如:如果前5个值分别是10、11、12、13、14、15,但您的数据包含10、10、11、12、13、14、15,则您只会得到10、10、11、12、13、13 14作为您的前5名,LIMIT

这是一个解决方案,如果有联系,它将返回10个以上的行,但是您将获得所有行,some_value_column从技术上讲,它排在前10位。

select
  *
from
  (select
     *,
     rank() over (order by some_value_column desc) as my_rank
  from mytable) subquery
where my_rank <= 10

从他的问题来看,表中只有一列。那么,为什么不“按分数降序限制10从分数顺序中选择不同的分数”呢?
德里克(Derek)

@Derek,好点。虽然在现实世界中的应用程序中可能并非如此,在该应用程序中,我们通常希望确定“某物”的前N个。
Raphvanns

真正。只关注他的确切问题。另外,我在像您这样的子查询中使用限制也很幸运,例如“从表中选择*值(从表顺序中选择不同的值,按值desc限制10)”,我认为这与您的相等。我不确定哪个查询的性能会更好,这可能取决于表结构和索引。
Derek

rank()之后缺少关键字OVER
Tiago Alcobia

2
(SELECT <some columns>
FROM mytable
<maybe some joins here>
WHERE <various conditions>
ORDER BY date DESC
LIMIT 10)

UNION ALL

(SELECT <some columns>
FROM mytable
<maybe some joins here>
WHERE <various conditions>
ORDER BY date ASC    
LIMIT 10)
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.