J'ai une question simple:
J'ai une postgresqlbase de données: Scores(score integer).
Comment puis-je obtenir les 10 meilleurs scores le plus rapidement?
METTRE À JOUR:
Je ferai cette requête plusieurs fois et je vise la solution la plus rapide.
J'ai une question simple:
J'ai une postgresqlbase de données: Scores(score integer).
Comment puis-je obtenir les 10 meilleurs scores le plus rapidement?
METTRE À JOUR:
Je ferai cette requête plusieurs fois et je vise la solution la plus rapide.
Réponses:
Pour cela, vous pouvez utiliser la limite
select *
from scores
order by score desc
limit 10
Si la performance est importante (quand ne l'est-elle pas ;-) recherchez un index sur le score.
À partir de la version 8.4, vous pouvez également utiliser le standard ( SQL: 2008 )fetch first
select *
from scores
order by score desc
fetch first 10 rows only
Comme l'a souligné @Raphvanns, cela vous donnera first 10 rowslittéralement. Pour supprimer les valeurs en double, vous devez sélectionner des distinctlignes, par exemple
select distinct *
from scores
order by score desc
fetch first 10 rows only
fetch first X rows onlyest la réponse que je cherchais - merci du futur lointain!
Semble que vous recherchez ORDER BYdans l' DESCordre de fin avec la clause LIMIT :
SELECT
*
FROM
scores
ORDER BY score DESC
LIMIT 10
Bien sûr, cela SELECT *pourrait sérieusement affecter les performances, alors utilisez-le avec prudence.
Notez que s'il y a des liens dans les 10 premières valeurs, vous n'obtiendrez que les 10 premières lignes, pas les 10 premières valeurs avec les réponses fournies. Ex: si les 5 premières valeurs sont 10, 11, 12, 13, 14, 15 mais que vos données contiennent 10, 10, 11, 12, 13, 14, 15, vous n'obtiendrez que 10, 10, 11, 12, 13, 14 comme votre top 5 avec unLIMIT
Voici une solution qui retournera plus de 10 lignes s'il y a des égalités mais vous obtiendrez toutes les lignes là où some_value_columnest techniquement dans le top 10.
select
*
from
(select
*,
rank() over (order by some_value_column desc) as my_rank
from mytable) subquery
where my_rank <= 10
explain analyze?