У меня простой вопрос:
У меня есть база данных 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
Кажется, что вы ищете 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() (order by some_value_column desc) as my_rank
from
mytable) subquery
where my_rank <= 10
(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)