Понякога може да се наложи да класирате над дял в MySQL или да направите групирано класиране в MySQL. Ще разгледаме как да класираме над дял, използвайки функцията за ранг на MySQL. Можете да използвате този подход за класиране във всяка група/раздел в таблица поотделно. Въпреки това, моля, имайте предвид, че тази функция е достъпна само от MySQL 8.0.
Ранг на MySQL над дял
Ще използваме функцията MySQL RANK() за класиране в рамките на групата. Ето синтаксиса на функцията MySQL RANK.
RANK() OVER ( PARTITION BY <expression>[{,<expression>...}] ORDER BY <expression> [ASC|DESC], [{,<expression>...}] )
Функцията за ранг присвоява ранг на всеки ред в рамките на дял, така че рангът на всеки ред да е един повече от общия брой редове, които са били класирани в този дял.
В горния синтаксис клаузата PARTITION BY ще раздели редовете на дялове. Можете да разделите таблица въз основа на една или повече стойности на колони. Ако не искате да разделяте таблицата, можете просто да пропуснете клаузата PARTITION BY напълно.
Бонус четене:Как да промените часовата зона на MySQL в заявката
Функцията Ранг ще изчисли ранга във всеки дял/група и ще инициализира отново номера на ранга, когато започва с нов дял.
Клаузата ORDER BY сортира редовете във всеки дял въз основа на стойности в една или повече колони.
Бонус четене:MySQL Сравнете бази данни
Да кажем, че имате следната таблица.
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 | +------+-------+--------+
Бонус за четене:MySQL Показване на индекси в бази данни
Ето заявката за присвояване на ранг на всеки ред от таблицата, без да се използва клауза 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 | +------+-------+--------+--------+
В горната заявка разделяме таблицата по име на месец и след това класираме всеки ред във всеки дял в низходящ ред на количеството.
Надяваме се, че сега можете лесно да използвате функцията MySQL Rank, за да класирате над дял и групи.
Ubiq улеснява визуализирането на данни за минути и наблюдение в табла за управление в реално време. Опитайте днес!