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.