Czasami może zajść potrzeba uszeregowania według partycji w MySQL lub zrobienia rankingu grupowego w MySQL. Przyjrzymy się, jak uszeregować nad partycją za pomocą funkcji rangowania MySQL. Możesz użyć tego podejścia do osobnego rankingu w każdej grupie/partycji w tabeli. Należy jednak pamiętać, że ta funkcja jest dostępna tylko w MySQL 8.0.
Ranking MySQL nad partycją
Użyjemy funkcji MySQL RANK() do rankingu w grupie. Oto składnia funkcji MySQL RANK.
RANK() OVER ( PARTITION BY <expression>[{,<expression>...}] ORDER BY <expression> [ASC|DESC], [{,<expression>...}] )
Funkcja rang przypisuje rangę do każdego wiersza w ramach partycji, tak że ranga każdego wiersza jest o jeden większa niż całkowita liczba wierszy, które zostały sklasyfikowane w tej partycji.
W powyższej składni klauzula PARTITION BY podzieli wiersze na partycje. Tabelę można podzielić na partycje na podstawie co najmniej jednej wartości kolumny. Jeśli nie chcesz dzielić tabeli na partycje, możesz po prostu całkowicie pominąć klauzulę PARTITION BY.
Przeczytaj bonus:Jak zmienić strefę czasową MySQL w zapytaniu
Funkcja Ranga obliczy rangę w każdej partycji/grupie i ponownie zainicjuje numer rangi przy rozpoczynaniu od nowej partycji.
Klauzula ORDER BY sortuje wiersze w każdej partycji na podstawie wartości w jednej lub kilku kolumnach.
Przeczytaj bonus:MySQL Porównaj bazy danych
Powiedzmy, że masz poniższą tabelę.
mysql> create table for_rank(id int, month varchar(10),amount int); mysql> insert into for_rank(id, month, amount) values(1,'Jan',450), (2,'Jan',350), (3,'Jan',250), (4,'Feb',150), (5,'Feb',450), (6,'Feb',500), (7,'Mar',350), (8,'Mar',450), (9,'Mar',250), (10,'Mar',150); mysql> select * from for_rank; +------+-------+--------+ | id | month | amount | +------+-------+--------+ | 1 | Jan | 450 | | 2 | Jan | 350 | | 3 | Jan | 250 | | 4 | Feb | 150 | | 5 | Feb | 450 | | 6 | Feb | 500 | | 7 | Mar | 350 | | 8 | Mar | 450 | | 9 | Mar | 250 | | 10 | Mar | 150 | +------+-------+--------+
Przeczytaj bonus:MySQL pokazuje indeksy w bazach danych
Oto zapytanie, które przypisuje rangę każdemu wierszowi tabeli, bez użycia klauzuli PARTITION BY.
SELECT id, month, amount, RANK() OVER ( PARTITION BY Month ORDER BY amount desc ) my_rank FROM for_rank; +------+-------+--------+--------+ | id | month | amount | rank | +------+-------+--------+--------+ | 6 | Feb | 500 | 1 | | 5 | Feb | 450 | 2 | | 4 | Feb | 150 | 3 | | 1 | Jan | 450 | 1 | | 2 | Jan | 350 | 2 | | 3 | Jan | 250 | 3 | | 8 | Mar | 450 | 1 | | 7 | Mar | 350 | 2 | | 9 | Mar | 250 | 3 | | 10 | Mar | 150 | 4 | +------+-------+--------+--------+
W powyższym zapytaniu dzielimy tabelę według nazwy miesiąca, a następnie szeregujemy każdy wiersz w każdej partycji w kolejności malejącej ilości.
Mam nadzieję, że teraz możesz łatwo użyć funkcji MySQL Rank do rankingu partycji i grup.
Ubiq ułatwia wizualizację danych w ciągu kilku minut i monitorowanie w pulpitach nawigacyjnych w czasie rzeczywistym. Wypróbuj już dziś!