postgresqlのトップ10の値を取得するにはどうすればよいですか?


257

私は簡単な質問があります:

postgresqlデータベースがあります:Scores(score integer)

最も高い10のスコアを最も速く取得するにはどうすればよいですか?

更新:

このクエリを複数回実行し、最速のソリューションを目指しています。


6
-1:これまでに何をしましたか?なぜそれで十分ではないのですか?Postgresのバージョンは何ですか?どこexplain analyzeですか
私の

回答:


373

これには制限を使用できます

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フィドル


2
fetch first X rows only私が探していた答えです-遠い未来からありがとう!
マスドットネット

36

LIMITORDER BYDESC終了順に探しているようです:

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

彼の質問から、表には列が1つしかありません。それでは、なぜ「スコアの制限10によるスコアの順序から個別のスコアを選択する」のではないのでしょうか。
デレク

@デレク、良い点。ただし、通常、「何か」の上位Nを特定しようとする実際のアプリでは、これは当てはまりません。
Raphvanns

そうだね。ちょうど彼の正確な質問に焦点を当てています。また、私は「(値の降順リミット10でテーブルの順序から個別の値を選択する)の値がどこのテーブルから選択*」など、あなたのようなサブクエリでの制限を使用して幸運を持っていたと思うそれはあなたと同等です。どのクエリの方がパフォーマンスが良いかわかりません。おそらくテーブルの構造とインデックスに依存します。
デレク

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)
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.