Eu tenho uma pergunta simples:
Eu tenho um postgresql
banco de dados: Scores(score integer)
.
Como obter as 10 pontuações mais altas mais rapidamente?
ATUALIZAR:
Farei essa consulta várias vezes e estou buscando a solução mais rápida.
Eu tenho uma pergunta simples:
Eu tenho um postgresql
banco de dados: Scores(score integer)
.
Como obter as 10 pontuações mais altas mais rapidamente?
ATUALIZAR:
Farei essa consulta várias vezes e estou buscando a solução mais rápida.
Respostas:
Para isso você pode usar limite
select *
from scores
order by score desc
limit 10
Se o desempenho é importante (quando não é ;-) procure um índice na pontuação.
A partir da versão 8.4, você também pode usar o padrão ( SQL: 2008 )fetch first
select *
from scores
order by score desc
fetch first 10 rows only
Como @Raphvanns apontou, isso lhe dará first 10 rows
literalmente. Para remover valores duplicados, você deve selecionar distinct
linhas, por exemplo
select distinct *
from scores
order by score desc
fetch first 10 rows only
fetch first X rows only
é a resposta que eu estava procurando - obrigado de um futuro distante!
Parece que você está procurando ORDER BY
em DESC
ordem final com a cláusula LIMIT :
SELECT
*
FROM
scores
ORDER BY score DESC
LIMIT 10
É claro que isso SELECT *
pode afetar seriamente o desempenho, portanto, use-o com cautela.
Nota que, se há laços em top 10 valores, você só vai conseguir o top 10 linhas, e não os 10 principais valores com as respostas dadas. Ex: se os 5 principais valores forem 10, 11, 12, 13, 14, 15, mas seus dados contiverem 10, 10, 11, 12, 13, 14, 15, você receberá apenas 10, 10, 11, 12, 13, 14 como seu top 5 com umLIMIT
Aqui está uma solução que retornará mais de 10 linhas se houver empate, mas você obterá todas as linhas onde some_value_column
está tecnicamente entre as 10 principais.
select
*
from
(select
*,
rank() over (order by some_value_column desc) as my_rank
from mytable) subquery
where my_rank <= 10
explain analyze
?