У меня простой вопрос:
У меня есть 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 с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
explain analyze
?