如何在PostgreSQL中获取前10个值?

457

我有一个简单的问题:

我有一个 postgresql 表格:Scores(score integer)

如何最快地获取前十个最高分数?

更新:

我将多次执行此查询,并且力求找到最快的解决方案。

4个回答

664

这可以使用limit来实现。

select *
from scores
order by score desc
limit 10

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


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

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

正如@Raphvanns所指出的,这将直接给您前10行。要删除重复值,您必须选择不同的行,例如使用distinct


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

SQL Fiddle


9
"fetch first X rows only" 是我正在寻找的答案——来自遥远的未来感谢你! - Mass Dot Net

43

看起来你正在寻找使用LIMIT子句以DESC方式排序的ORDER BY

SELECT
 *
FROM
  scores
ORDER BY score DESC
LIMIT 10

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


15
请注意,如果前10个数值中存在并列的情况,你只会得到前10行数据,而不是根据提供的答案获取前10个数值。例如,如果前5个值为10、11、12、13、14、15,但你的数据包含10、10、11、12、13、14、15,那么在使用LIMIT时,你只会得到10、10、11、12、13、14作为前5个值。
以下是一个解决方案,如果存在并列的情况,则会返回超过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

从他的问题中可以看出,表中只有一列。那么为什么不使用"select distinct score from Scores order by score desc limit 10"呢? - Derek
@Derek,说得好。虽然在现实世界的应用程序中,我们通常是要识别“某些东西”的前N个,所以情况可能不会这样。 - Raphvanns
只关注他的确切问题。此外,我在像你这样的子查询中使用limit取得了良好的效果,例如“select * from table where value in (select distinct value from table order by value desc limit 10)” 我认为这与你的查询是等价的。我不确定我们的哪个查询性能更好,这可能取决于表结构和索引。 - Derek
1
rank()后缺少关键字OVER。 - Tiago Alcobia

4
(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)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接