Leçons du module (3/4)
Classements : ROW_NUMBER, RANK et DENSE_RANK
Classements : ROW_NUMBER, RANK et DENSE_RANK
Au-delà de l'agrégation, les fonctions de fenêtre brillent dans le classement et le classement. Il existe des fonctions conçues spécifiquement pour fonctionner à l'intérieur des fenêtres (OVER() devient obligatoire) qui attribuent des numéros séquentiels ou des positions de classement.
Pour les faire fonctionner par rapport à un critère, nous devons utiliser la clause ORDER BY à l'intérieur de OVER().
Le trio de classement
ROW_NUMBER(): attribue un numéro séquentiel simple (1, 2, 3...) à chaque ligne, brisant arbitrairement les égalités.RANK(): Produit l'effet "Olympiques" : 1, 2, 2, 4. Il laisse un vide (le "3" est sauté) et attribue le même rang en cas d'égalité.DENSE_RANK(): Densifie les rangs : 1, 2, 2, 3. Il n'y a jamais d'écart après une égalité.
SELECT
product_name,
price,
RANK() OVER(ORDER BY price DESC) AS price_rank
FROM products;En combinant PARTITION BY et ORDER BY ensemble dans OVER(), nous pouvons obtenir « le top 3 pour chaque catégorie » !
Extrayez « prénom », « nom de famille » et « id » de la table clients (« clients ») (en supposant que « id » soit le numéro d'identification). Ajoutez une colonne « rang » en utilisant DENSE_RANK() basée sur « id » décroissant (du plus élevé au plus bas).
Afficher l'indice
DENSE_RANK() OVER(ORDER BY id DESC).
Solution disponible après 3 tentatives
Créez un classement pour chaque «category_id» en fonction du prix des produits («products»). Extrayez 'category_id', 'id', 'price' et ajoutez 'price_rank' à l'aide de ROW_NUMBER() dans l'ordre décroissant du 'price', en partitionnant par 'category_id'.
Afficher l'indice
Combinez PARTITION BYcategory_id ORDER BY prix DESC à l'intérieur du OVER.
Solution disponible après 3 tentatives