Lezioni del modulo (3/4)
Classifiche: ROW_NUMBER, RANK e DENSE_RANK
Classifiche: ROW_NUMBER, RANK e DENSE_RANK
Oltre ad aggregare, le funzioni finestra brillano nell'ordinare e classificare. Esistono funzioni prettamente nate per lavorare dentro le finestre (OVER() diventa obbligatorio) che assegnano numeri sequenziali o posizioni di classifica.
Per farle funzionare con un criterio, dobbiamo usare la clausola ORDER BY all'interno di OVER().
La triade del Ranking
ROW_NUMBER(): Assegna un mero numero sequenziale (1, 2, 3...) a ogni riga, risolvendo i pareggi in modo arbitrario.RANK(): Crea l'effetto "Olimpiadi": 1, 2, 2, 4. Lascia un buco (il "3" salta) e assegna lo stesso rango in caso di parimerito.DENSE_RANK(): Densifica i ranghi: 1, 2, 2, 3. Non vi è mai salto dopo un parimerito.
SELECT
product_name,
price,
RANK() OVER(ORDER BY price DESC) AS price_rank
FROM products;Combinando PARTITION BY e ORDER BY insieme dentro OVER() possiamo ottenere "I primi 3 per ogni categoria"!
Estrai 'first_name', 'last_name' e 'id' dalla tabella clienti ('customers') (assumiamo 'id' come numero identificativo). Aggiungi una colonna 'rank' usando DENSE_RANK() basata su 'id' decrescente (dal più alto al più basso).
Mostra suggerimento
DENSE_RANK() OVER(ORDER BY id DESC).
Soluzione disponibile dopo 3 tentativi
Stila una classifica per ogni 'category_id' in base al prezzo dei prodotti ('products'). Estrai 'category_id', 'id', 'price' e aggiungi 'price_rank' usando ROW_NUMBER() in ordine di 'price' decrescente, partizionando per 'category_id'.
Mostra suggerimento
Combina PARTITION BY category_id ORDER BY price DESC dentro l'OVER.
Soluzione disponibile dopo 3 tentativi