Понякога може да се наложи да изберете горните N реда от всяка група в MySQL. Ето как да изберете първите N реда на група в MySQL. Можете да го използвате, за да получите топ n резултата на група, да изберете топ 10 записа за всяка категория или да изберете първия запис от всяка група.
MySQL Изберете най-добрите N реда на група
Ето стъпките за избор на горни N реда на група. Да приемем, че имате следната таблица поръчки (идентификатор, продукт, количество)
mysql> create table product_orders(id int,product varchar(255),amount int); mysql> insert into product_orders(id, product, amount) values(1,'A',250),(2,'B',150),(3,'C',200), (4,'A',250),(5,'B',210),(6,'C',125), (7,'A',350),(8,'B',225),(9,'C',150); mysql> select * from product_orders; +------+---------+--------+ | id | product | amount | +------+---------+--------+ | 1 | A | 250 | | 2 | B | 150 | | 3 | C | 200 | | 4 | A | 250 | | 5 | B | 210 | | 6 | C | 125 | | 7 | A | 350 | | 8 | B | 225 | | 9 | C | 150 | +------+---------+--------+
Бонус четене:Как да получите данни от миналата седмица в MySQL
Как да изберете най-добрите N реда на група в MySQL
Първо, ще класираме всеки ред в неговата група (продукт колона) с помощта на следната SQL заявка.
mysql> SELECT id, product, amount, @product_rank := IF(@current_product = product, @product_rank + 1, 1) AS product_rank, @current_product := product FROM product_orders ORDER BY product, amount desc; +------+---------+--------+--------------+-----------------------------+ | id | product | amount | product_rank | @current_product := product | +------+---------+--------+--------------+-----------------------------+ | 7 | A | 350 | 1 | A | | 1 | A | 250 | 2 | A | | 4 | A | 250 | 3 | A | | 8 | B | 225 | 1 | B | | 5 | B | 210 | 2 | B | | 2 | B | 150 | 3 | B | | 3 | C | 200 | 1 | C | | 9 | C | 150 | 2 | C | | 6 | C | 125 | 3 | C | +------+---------+--------+--------------+-----------------------------+
В горната заявка първо сме сортирали всеки запис в неговата група по колона за сума в низходящ ред и след това го класирахме. Ако искате да го сортирате във възходящ ред на сумите, можете да го направите, като промените клаузата ORDER by.
SELECT id, product, amount, @product_rank := IF(@current_product = product, @product_rank + 1, 1) AS product_rank, @current_product := product FROM product_orders ORDER BY product, amount asc;
След това използваме горната заявка като подзаявка, за да изберем първите N реда на група (напр. първите 2 реда за всяка категория).
Бонус четене:MySQL Copy Database
Как да изберете първите 2 реда на група
Ето SQL заявката за избор на първите 2 реда за всяка група, използвайки горния метод. Ще използваме горната заявка като подзаявка и ще изберем редове, чийто ранг е по-малък или равен на 2.
mysql> select id, product, amount from ( SELECT id, product, amount, @product_rank := IF(@current_product = product, @product_rank + 1, 1) AS product_rank, @current_product := product FROM product_orders ORDER BY product, amount desc) ranked_rows where product_rank<=2; +------+---------+--------+ | id | product | amount | +------+---------+--------+ | 7 | A | 350 | | 1 | A | 250 | | 8 | B | 225 | | 5 | B | 210 | | 3 | C | 200 | | 9 | C | 150 | +------+---------+--------+
Бонус четене:MySQL Вмъкване в Select
Как да изберете първите 10 реда на група
По същия начин можете да изберете първите 10 реда от всяка група, като използвате следната заявка.
mysql> select id, product, amount from ( SELECT id, product, amount, @product_rank := IF(@current_product = product, @product_rank + 1, 1) AS product_rank, @current_product := product FROM product_orders ORDER BY product, amount desc) ranked_rows where product_rank<=10;
Надяваме се, че сега можете лесно да изберете най-добрите N реда на група в MySQL.
Ubiq улеснява визуализирането на данни за минути и наблюдение в табла за управление в реално време. Опитайте днес!