Vai al contenuto
eLearner.app
Modulo 13 · Lezione 3 di 451/57 nel corso~15 min
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

  1. ROW_NUMBER(): Assegna un mero numero sequenziale (1, 2, 3...) a ogni riga, risolvendo i pareggi in modo arbitrario.
  2. RANK(): Crea l'effetto "Olimpiadi": 1, 2, 2, 4. Lascia un buco (il "3" salta) e assegna lo stesso rango in caso di parimerito.
  3. DENSE_RANK(): Densifica i ranghi: 1, 2, 2, 3. Non vi è mai salto dopo un parimerito.
SQL
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"!

Esercizio#sql.m13.l3.e1
Tentativi: 0Caricamento…

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).

Caricamento editor…
Mostra suggerimento

DENSE_RANK() OVER(ORDER BY id DESC).

Soluzione disponibile dopo 3 tentativi

Esercizio#sql.m13.l3.e2
Tentativi: 0Caricamento…

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'.

Caricamento editor…
Mostra suggerimento

Combina PARTITION BY category_id ORDER BY price DESC dentro l'OVER.

Soluzione disponibile dopo 3 tentativi