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.