Ho una semplice domanda:
Ho un postgresql
database: Scores(score integer)
.
Come ottenere i 10 punteggi più alti il più veloce?
AGGIORNARE:
Farò questa domanda più volte e cerco la soluzione più veloce.
Ho una semplice domanda:
Ho un postgresql
database: Scores(score integer)
.
Come ottenere i 10 punteggi più alti il più veloce?
AGGIORNARE:
Farò questa domanda più volte e cerco la soluzione più veloce.
Risposte:
Per questo puoi usare il limite
select *
from scores
order by score desc
limit 10
Se la prestazione è importante (quando non lo è ;-) cerca un indice sul punteggio.
A partire dalla versione 8.4, è anche possibile utilizzare lo standard ( SQL: 2008 )fetch first
select *
from scores
order by score desc
fetch first 10 rows only
Come ha sottolineato @Raphvanns, questo ti darà first 10 rows
letteralmente. Per rimuovere valori duplicati, è necessario selezionare le distinct
righe, ad es
select distinct *
from scores
order by score desc
fetch first 10 rows only
fetch first X rows only
è la risposta che stavo cercando - grazie dal lontano futuro!
Sembra che tu stia cercando ORDER BY
in DESC
ordine finale con la clausola LIMIT :
SELECT
*
FROM
scores
ORDER BY score DESC
LIMIT 10
Ovviamente SELECT *
potrebbe compromettere seriamente le prestazioni, quindi usalo con cautela.
Nota che se ci sono legami dei primi 10 valori, si ottiene solo la parte superiore 10 righe, non i primi 10 valori con le risposte fornite. Es .: se i primi 5 valori sono 10, 11, 12, 13, 14, 15 ma i tuoi dati contengono 10, 10, 11, 12, 13, 14, 15 otterrai solo 10, 10, 11, 12, 13, 14 come la tua top 5 con aLIMIT
Ecco una soluzione che restituirà più di 10 righe se ci sono legami ma otterrai tutte le righe dov'è some_value_column
tecnicamente tra le prime 10.
select
*
from
(select
*,
rank() over (order by some_value_column desc) as my_rank
from mytable) subquery
where my_rank <= 10
explain analyze
?