Come ottenere i primi 10 valori in postgresql?


257

Ho una semplice domanda:

Ho un postgresqldatabase: 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.


6
-1: cosa hai fatto finora? Perché non è abbastanza buono? Qual è la versione di Postgres? Dov'è explain analyze?
mys,

Risposte:


373

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 rowsletteralmente. Per rimuovere valori duplicati, è necessario selezionare le distinctrighe, ad es

select distinct *
from scores
order by score desc
fetch first 10 rows only

SQL Fiddle


2
fetch first X rows onlyè la risposta che stavo cercando - grazie dal lontano futuro!
Mass Dot Net

36

Sembra che tu stia cercando ORDER BYin DESCordine 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.


3

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_columntecnicamente 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

Dalla sua domanda c'è solo una colonna nella tabella. Quindi perché non "selezionare un punteggio distinto dall'ordine dei punteggi in base al limite di descrizione del punteggio 10"?
Derek,

@Derek, buon punto. Anche se questo probabilmente non sarebbe il caso in un'app del mondo reale in cui di solito stiamo cercando di identificare la N più in alto di "qualcosa".
Raphvanns

Vero. Concentrandosi solo sulla sua domanda esatta. Inoltre, ho avuto fortuna ad usare il limite in una sottoquery come la tua, ad es. "Seleziona * dalla tabella in cui valore in (seleziona un valore distinto dall'ordine della tabella in base al valore dec limite 10)" Penso che sia equivalente al tuo. Non sono sicuro di quale delle nostre query avrebbe prestazioni migliori, probabilmente dipenderebbe dalla struttura e dall'indicizzazione della tabella.
Derek,

Manca una parola chiave OVER dopo rank ()
Tiago Alcobia il

2
(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)
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.