Eu tenho uma pergunta simples:
Eu tenho um postgresqlbanco 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 postgresqlbanco 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 rowsliteralmente. Para remover valores duplicados, você deve selecionar distinctlinhas, 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 BYem DESCordem 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_columnestá 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?