Mysql
 sql >> база данни >  >> RDS >> Mysql

Как да класирате над дял в MySQL

Понякога може да се наложи да класирате над дял в 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 улеснява визуализирането на данни за минути и наблюдение в табла за управление в реално време. Опитайте днес!

  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. rails + MySQL на OSX:Библиотеката не е заредена:libmysqlclient.18.dylib

  2. Как да направя замяна на регулярен израз в MySQL?

  3. MySQL данни - Най-добрият начин за прилагане на пейджинг?

  4. MySQL ЗАРЕЖДАНЕ НА ДАННИ INFILE с ПРИ АКТУАЛИЗИРАНЕ НА ДУБЛИРАН КЛЮЧ

  5. Как да създадете MySQL потребител само за четене?