如何获取 postgresql 中的前 10 个值?
Posted
技术标签:
【中文标题】如何获取 postgresql 中的前 10 个值?【英文标题】:How to get the top 10 values in postgresql? 【发布时间】:2012-11-20 08:59:26 【问题描述】:我有一个简单的问题:
我有一个 postgresql
表:Scores(score integer)
。
如何最快获得最高的 10 分?
更新:
我将多次执行此查询,并以最快的解决方案为目标。
【问题讨论】:
-1:到目前为止你做了什么?为什么这还不够好?什么是 Postgres 版本?explain analyze
在哪里?
【参考方案1】:
请注意,如果前 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
【讨论】:
从他的问题来看,表格中只有一列。那么,为什么不“从 Scores order by score desc limit 10 中选择不同的分数”呢? @Derek,说得好。尽管在现实世界的应用程序中可能并非如此,我们通常希望识别“某物”的前 N 个。 是的。只是专注于他的确切问题。另外,我很幸运在像你这样的子查询中使用限制,例如“select * from table where value in (select distinct value from table order by value desc limit 10)”我认为这和你的一样。我不确定我们的哪个查询会执行得更好,这可能取决于表结构和索引。 rank()后缺少关键字OVER【参考方案2】:为此,您可以使用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 所指出的,这将给你first 10 rows
字面意思。要删除重复值,您必须选择 distinct
行,例如
select distinct *
from scores
order by score desc
fetch first 10 rows only
SQL Fiddle
【讨论】:
fetch first X rows only
是我一直在寻找的答案——从遥远的未来感谢您!【参考方案3】:
(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)
【讨论】:
【参考方案4】:您似乎正在寻找ORDER BY
in DESC
ending order with LIMIT 子句:
SELECT
*
FROM
scores
ORDER BY score DESC
LIMIT 10
当然SELECT *
会严重影响性能,因此请谨慎使用。
【讨论】:
以上是关于如何获取 postgresql 中的前 10 个值?的主要内容,如果未能解决你的问题,请参考以下文章