Як отримати найкращі 10 значень у postgresql?


256

У мене просте запитання:

У мене є postgresqlбаза даних: Scores(score integer).

Як би я отримав найвищі 10 балів найшвидше?

ОНОВЛЕННЯ:

Я буду робити цей запит кілька разів і прагну найшвидшого рішення.


6
-1: що ви робили досі? Чому це недостатньо добре? Яка версія Postgres? Де explain analyze?
міс

Відповіді:


372

Для цього ви можете використовувати ліміт

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


2
fetch first X rows onlyце відповідь, яку я шукав - дякую з далекого майбутнього!
Mass Dot Net

35

Здається, ви шукаєте ORDER BYв DESCкінцевому порядку з пунктом LIMIT :

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, 14, як ваш топ-5 з aLIMIT

Ось рішення, яке поверне більше 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

З його запитання є лише одна колонка в таблиці. То чому б не "вибрати чіткий бал із порядку балів за лімітом значення 10"?
Дерек

@Дерек, хороший момент. Хоча, мабуть, це не так у реальному додатку, де ми, як правило, прагнемо визначити вершину N "щось таке".
Рафванс

Правда. Просто зосередившись на його точному питанні. Крім того, мені пощастило використовувати limit у підзапиті, як ваш, наприклад, "select * from table, де значення в (виберіть окреме значення з порядку таблиці за значенням desc limit 10)" Я думаю, що це еквівалентно вашому. Я не впевнений, який із наших запитів мав би кращу ефективність, можливо, це залежатиме від структури таблиці та індексації.
Дерек

Не вистачає ключового слова НАДА після рангу ()
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)
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.