У мене просте запитання:
У мене є postgresql
база даних: Scores(score integer)
.
Як би я отримав найвищі 10 балів найшвидше?
ОНОВЛЕННЯ:
Я буду робити цей запит кілька разів і прагну найшвидшого рішення.
У мене просте запитання:
У мене є postgresql
база даних: Scores(score integer)
.
Як би я отримав найвищі 10 балів найшвидше?
ОНОВЛЕННЯ:
Я буду робити цей запит кілька разів і прагну найшвидшого рішення.
Відповіді:
Для цього ви можете використовувати ліміт
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
fetch first X rows only
це відповідь, яку я шукав - дякую з далекого майбутнього!
Здається, ви шукаєте ORDER BY
в DESC
кінцевому порядку з пунктом LIMIT :
SELECT
*
FROM
scores
ORDER BY score DESC
LIMIT 10
Звичайно, це SELECT *
може серйозно вплинути на продуктивність, тому використовуйте їх обережно.
Зауважте, що якщо є зв’язки у перших 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
explain analyze
?