357

我有一个简单的问题:

我有一张postgresql桌子:Scores(score integer)

我怎样才能最快地获得最高的 10 分?

更新:

我将多次执行此查询,并以最快的解决方案为目标。

4

4 回答 4

531

为此,您可以使用限制

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 指出的那样,这会给你first 10 rows字面意思。要删除重复值,您必须选择distinct行,例如

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

SQL小提琴

于 2012-12-02T21:29:52.473 回答
40

似乎您正在寻找带有LIMIT子句ORDER BYDESC结束顺序:

SELECT
 *
FROM
  scores
ORDER BY score DESC
LIMIT 10

当然SELECT *会严重影响性能,所以请谨慎使用。

于 2012-12-02T21:31:34.783 回答
11

请注意,如果前 10 个值中存在关联,您将仅获得前 10 行,而不是提供答案的前 10 个值。例如:如果前 5 个值是 10、11、12、13、14、15,但您的数据包含 10、10、11、12、13、14、15,那么您只会得到 10、10、11、12、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
于 2018-12-31T00:31:53.927 回答
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)
于 2019-04-17T07:01:14.310 回答