Lecții din modul (3/4)
Clasamente: ROW_NUMBER, RANK și DENSE_RANK
Clasamente: ROW_NUMBER, RANK și DENSE_RANK
Dincolo de agregare, funcțiile ferestrei strălucesc la ordine și clasare. Există funcții concepute special pentru a funcționa în interiorul ferestrelor (OVER() devine obligatorie) care atribuie numere secvențiale sau poziții de clasare.
Pentru a le face să funcționeze pe baza unui criteriu, trebuie să folosim clauza ORDER BY în interiorul OVER().
Trio-ul de clasament
ROW_NUMBER(): atribuie un număr secvenţial simplu (1, 2, 3...) fiecărui rând, rupând legăturile în mod arbitrar.RANK(): Produce efectul „Olimpic”: 1, 2, 2, 4. Lasă un gol („3” este omis) și atribuie același rang în caz de egalitate.DENSE_RANK(): Densifică rangurile: 1, 2, 2, 3. Nu există niciodată un decalaj după o egalitate.
SELECT
product_name,
price,
RANK() OVER(ORDER BY price DESC) AS price_rank
FROM products;Combinând PARTITION BY și ORDER BY împreună în interiorul OVER() putem obține „primii 3 pentru fiecare categorie”!
Extrageți „first_name”, „last_name” și „id” din tabelul clienți („clienți”) (presupunem că „id” este numărul de identificare). Adăugați o coloană „clasament” folosind DENSE_RANK() pe baza „id” descendent (de la cel mai mare la cel mai mic).
Afișează indiciu
DENSE_RANK() OVER(ORDER BY id DESC).
Soluție disponibilă după 3 încercări
Creați un clasament pentru fiecare „category_id” pe baza prețului produselor („produs”). Extrageți „category_id”, „id”, „price” și adăugați „price_rank” folosind ROW_NUMBER() în ordine descrescătoare „price”, partiționând după „category_id”.
Afișează indiciu
Combinați PARTITION BY categorie_id ORDER BY preț DESC în interiorul OVER.
Soluție disponibilă după 3 încercări