我有一个简单的问题:

我有一个postgresql表:分数(分数整数)。

我怎样才能最快地拿到前10分?

更新:

我将做这个查询多次,我的目标是最快的解决方案。


当前回答

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

其他回答

你可以用limit

select *
from scores
order by score desc
limit 10

如果表现是重要的(当它不是;-)寻找一个指数的分数。


从8.4版本开始,还可以先使用标准(SQL:2008)获取

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

正如@Raphvanns指出的,这将为您提供前10行。要删除重复的值,您必须选择不同的行,例如。

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

SQL小提琴

似乎您正在寻找ORDER BY降序与LIMIT子句:

SELECT
 *
FROM
  scores
ORDER BY score DESC
LIMIT 10

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

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

请注意,如果前10个值中有关联,您将只获得前10行,而不是提供答案的前10个值。 例如:如果前5个值是10、11、12、13、14、15,但你的数据包含 10, 10, 11, 12, 13, 14, 15你只能得到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