Database
 sql >> Database >  >> RDS >> Database

Come classificare le righe all'interno di una partizione in SQL

Problema:

Nel set di risultati, desideri partizionare i record e classificare le righe all'interno di ciascuna partizione, aggiungendo un'altra colonna per mostrare i ranghi delle righe all'interno della partizione.

Esempio:

Il nostro database ha una tabella denominata magazine con i dati nelle seguenti colonne:id (chiave primaria), name , category e price .

id categoria prezzo
105 Vita di campagna stile di vita 1.70
108 Rivista di notizie notizie 3.35
115 Decibel musica 6.50
123 Rivista di batteria musica 6.50
145 Tramonto stile di vita 12:00
155 Mondo stile di vita 9:50
158 Tastiera musica 8.45

Raggruppiamo le riviste in base alla categoria e classifica ogni gruppo in ordine decrescente per prezzo . Visualizza la posizione in classifica, il nome, la categoria e il prezzo di ciascuna rivista.

Soluzione:

SELECT  
  category,
  name,
  price,
  RANK() OVER (PARTITION BY category
                    ORDER BY price DESC
                    ) AS price_rank
FROM magazine;

Ecco il risultato:

categoria prezzo price_rank
stile di vita Tramonto 12:00 1
stile di vita Mondo 9:50 2
stile di vita Vita di campagna 1.70 3
musica Tastiera 8.45 1
musica Decibel 6.50 2
musica Rivista di batteria 6.50 2
notizie Rivista di notizie 3.35 1

Discussione:

Per partizionare le righe e classificarle in base alla loro posizione all'interno della partizione, utilizzare la funzione RANK() con la clausola PARTITION BY.

La funzione RANK() di SQL ci consente di aggiungere la posizione di un record all'interno del set di risultati o all'interno di ciascuna partizione. Nel nostro esempio, classifichiamo le righe all'interno di una partizione.

La clausola OVER() viene sempre dopo RANK(). OVER() deve contenere una clausola ORDER BY. Se stai restituendo ranghi all'interno di una partizione, inserisci una clausola PARTITION BY all'interno della clausola OVER(). PARTITION BY è seguito da un'espressione o da un nome di colonna; nel nostro esempio utilizziamo la colonna category (PARTITION BY category ).

Nota: Se non stai utilizzando partizioni, puoi omettere PARTITION BY e inserire semplicemente la clausola ORDER BY in OVER().

Dopo PARTITION BY, inserire ORDER BY seguito dai nomi delle colonne o delle espressioni di ordinamento. Nel nostro esempio, stiamo ordinando in ordine decrescente in base alla colonna price (ORDER BY price DESC ). La parola chiave DESC indica un ordinamento decrescente.

Nell'esempio precedente, l'utilizzo di RANK() con PARTITION BY ha diviso i risultati impostati in gruppi separati di riviste in base alla loro categoria . Con ogni gruppo, le righe sono state ordinate per prezzo e poi classificato all'interno di quel gruppo.