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.