Passer au contenu principal
eLearner.app
Module 13 · Leçon 3 sur 451/57 dans le cours~15 min
Leçons du module (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"!

Exercice#sql.m13.l3.e1
Tentatives : 0Chargement…

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

Chargement de l'éditeur…
Afficher l'indice

DENSE_RANK() OVER(ORDER BY id DESC).

Solution disponible après 3 tentatives

Exercice#sql.m13.l3.e2
Tentatives : 0Chargement…

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

Chargement de l'éditeur…
Afficher l'indice

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

Solution disponible après 3 tentatives