Problém:
Ve výsledné sadě byste chtěli rozdělit záznamy a seřadit řádky v rámci každého oddílu a přidat další sloupec pro zobrazení pořadí řádků v rámci oddílu.
Příklad:
Naše databáze obsahuje tabulku s názvem časopis s údaji v následujících sloupcích:id
(primární klíč), name
, category
a price
.
id | jméno | kategorie | cena |
---|---|---|---|
105 | Život na venkově | životní styl | 1,70 |
108 | Časopis News | novinky | 3,35 |
115 | Decibel | hudba | 6,50 |
123 | Drum Magazine | hudba | 6,50 |
145 | Západ slunce | životní styl | 12:00 |
155 | Svět | životní styl | 9,50 |
158 | Klávesnice | hudba | 8,45 |
Seskupme časopisy podle kategorie a seřadit každou skupinu v sestupném pořadí podle ceny . Zobrazte pozici v žebříčku, název, kategorii a cenu každého časopisu.
Řešení:
SELECT category, name, price, RANK() OVER (PARTITION BY category ORDER BY price DESC ) AS price_rank FROM magazine;
Zde je výsledek:
kategorie | jméno | cena | price_rank |
---|---|---|---|
životní styl | Západ slunce | 12:00 | 1 |
životní styl | Svět | 9,50 | 2 |
životní styl | Život na venkově | 1,70 | 3 |
hudba | Klávesnice | 8,45 | 1 |
hudba | Decibel | 6,50 | 2 |
hudba | Drum Magazine | 6,50 | 2 |
novinky | Časopis News | 3,35 | 1 |
Diskuse:
Chcete-li rozdělit řádky a seřadit je podle jejich pozice v oddílu, použijte funkci RANK() s klauzulí PARTITION BY.
Funkce SQL RANK() nám umožňuje přidat pozici záznamu v sadě výsledků nebo v rámci každého oddílu. V našem příkladu řadíme řádky v rámci oddílu.
Klauzule OVER() vždy následuje po RANK(). OVER() musí obsahovat klauzuli ORDER BY. Pokud vracíte hodnosti v rámci oddílu, umístěte do klauzule OVER() klauzuli PARTITION BY. PARTITION BY následuje výraz nebo název sloupce; v našem příkladu používáme sloupec category
(PARTITION BY category
).
Poznámka: Pokud nepoužíváte oddíly, můžete PARTITION BY vynechat a jednoduše vložit klauzuli ORDER BY do OVER().
Po PARTITION BY zadejte ORDER BY následované názvy třídicích sloupců nebo výrazů. V našem příkladu provádíme řazení v sestupném pořadí podle sloupce price
(ORDER BY price DESC
). Klíčové slovo DESC označuje sestupné pořadí řazení.
Ve výše uvedeném příkladu použití RANK() s PARTITION BY rozdělilo sadu výsledků do samostatných skupin časopisů podle jejich kategorie . U každé skupiny byly řádky seřazeny podle ceny a poté zařazen do této skupiny.