Problem:
W zestawie wyników chcesz podzielić rekordy i uszeregować wiersze w każdej partycji, dodając kolejną kolumnę, aby pokazać rangi wierszy w partycji.
Przykład:
Nasza baza danych zawiera tabelę o nazwie magazyn z danymi w następujących kolumnach:id (klucz podstawowy), name , category i price .
| id | imię | kategoria | cena |
|---|---|---|---|
| 105 | Życie na wsi | styl życia | 1,70 |
| 108 | Magazyn informacyjny | wiadomości | 3,35 |
| 115 | Decybel | muzyka | 6,50 |
| 123 | Magazyn perkusyjny | muzyka | 6,50 |
| 145 | Zachód słońca | styl życia | 12.00 |
| 155 | Świat | styl życia | 9,50 |
| 158 | Klawiatura | muzyka | 8,45 |
Pogrupujmy czasopisma według kategorii i uszereguj każdą grupę w kolejności malejącej według ceny . Wyświetlaj pozycję w rankingu, nazwę, kategorię i cenę każdego magazynu.
Rozwiązanie:
SELECT
category,
name,
price,
RANK() OVER (PARTITION BY category
ORDER BY price DESC
) AS price_rank
FROM magazine;
Oto wynik:
| kategoria | imię | cena | price_rank |
|---|---|---|---|
| styl życia | Zachód słońca | 12.00 | 1 |
| styl życia | Świat | 9,50 | 2 |
| styl życia | Życie na wsi | 1,70 | 3 |
| muzyka | Klawiatura | 8,45 | 1 |
| muzyka | Decybel | 6,50 | 2 |
| muzyka | Magazyn perkusyjny | 6,50 | 2 |
| wiadomości | Magazyn informacyjny | 3,35 | 1 |
Dyskusja:
Aby podzielić wiersze i uszeregować je według ich pozycji w partycji, użyj funkcji RANK() z klauzulą PARTITION BY.
Funkcja RANK() SQL pozwala nam dodać pozycję rekordu w zestawie wyników lub w każdej partycji. W naszym przykładzie szeregujemy wiersze w ramach partycji.
Klauzula OVER() zawsze występuje po RANK(). OVER() musi zawierać klauzulę ORDER BY. Jeśli zwracasz rangi w ramach partycji, umieść klauzulę PARTITION BY wewnątrz klauzuli OVER(). Po PARTITION BY następuje nazwa wyrażenia lub kolumny; w naszym przykładzie używamy kolumny category (PARTITION BY category ).
Uwaga: Jeśli nie używasz partycji, możesz pominąć PARTITION BY i po prostu umieścić klauzulę ORDER BY w OVER().
Po PARTITION BY umieść ORDER BY, a następnie nazwy kolumn lub wyrażeń sortowania. W naszym przykładzie sortujemy w porządku malejącym według kolumny price (ORDER BY price DESC ). Słowo kluczowe DESC wskazuje malejący porządek sortowania.
W powyższym przykładzie użycie funkcji RANK() z PARTITION BY podzieliło zestaw wyników na oddzielne grupy czasopism według ich kategorii . W każdej grupie wiersze zostały posortowane według ceny a następnie znalazł się w tej grupie.