Когато управлявате бизнес за електронна търговия или онлайн магазин, може да се наложи да изберете топ 10 записа за всяка категория продукти, марки и т.н. за отчитане и анализ. В тази статия ще разгледаме как да изберем топ 10 записа за всяка категория в MySQL.
Изберете топ 10 записа за всяка категория
Ето стъпките за избор на топ 10 записа за всяка категория. Да кажем, че имате следната таблица sales(id, product, order_date, amount) .
mysql> create table sales(id int, product varchar(255), order_date date, amount int); mysql> insert into sales(id, product, order_date, amount) values(1,'A','2021-01-01',125), (2,'A','2021-01-02',225), (3,'A','2021-01-03',325), (4,'A','2021-01-04',105), (5,'A','2021-01-05',150), (6,'A','2021-01-06',215), (7,'A','2021-01-07',205), (8,'A','2021-01-08',125), (9,'A','2021-01-09',350), (10,'A','2021-01-10',235), (11,'A','2021-01-11',325), (12,'B','2021-01-01',150), (13,'B','2021-01-02',165), (14,'B','2021-01-03',145), (15,'B','2021-01-04',115), (16,'B','2021-01-05',105), (17,'B','2021-01-06',195), (18,'B','2021-01-07',185), (19,'B','2021-01-08',175), (20,'B','2021-01-09',165), (21,'B','2021-01-10',115), (22,'B','2021-01-11',125); mysql> select * from sales; +------+---------+------------+--------+ | id | product | order_date | amount | +------+---------+------------+--------+ | 1 | A | 2021-01-01 | 125 | | 2 | A | 2021-01-02 | 225 | | 3 | A | 2021-01-03 | 325 | | 4 | A | 2021-01-04 | 105 | | 5 | A | 2021-01-05 | 150 | | 6 | A | 2021-01-06 | 215 | | 7 | A | 2021-01-07 | 205 | | 8 | A | 2021-01-08 | 125 | | 9 | A | 2021-01-09 | 350 | | 10 | A | 2021-01-10 | 235 | | 11 | A | 2021-01-11 | 325 | | 12 | B | 2021-01-01 | 150 | | 13 | B | 2021-01-02 | 165 | | 14 | B | 2021-01-03 | 145 | | 15 | B | 2021-01-04 | 115 | | 16 | B | 2021-01-05 | 105 | | 17 | B | 2021-01-06 | 195 | | 18 | B | 2021-01-07 | 185 | | 19 | B | 2021-01-08 | 175 | | 20 | B | 2021-01-09 | 165 | | 21 | B | 2021-01-10 | 115 | | 22 | B | 2021-01-11 | 125 | +------+---------+------------+--------+
Бонус четене:Общ израз на таблица в MySQL
Ще изберем топ 10 записа по количество колона за всяка категория (продукт). Първо, ще класираме всеки ред в неговата група (продукт).
mysql> SELECT id, product, amount, @product_rank := IF(@current_product = product, @product_rank + 1, 1) AS product_rank, @current_product := product as current_product FROM product_orders ORDER BY product, amount desc; +------+---------+--------+--------------+-----------------+ | id | product | amount | product_rank | current_product | +------+---------+--------+--------------+-----------------+ | 9 | A | 350 | 1 | A | | 3 | A | 325 | 2 | A | | 11 | A | 325 | 3 | A | | 10 | A | 235 | 4 | A | | 2 | A | 225 | 5 | A | | 6 | A | 215 | 6 | A | | 7 | A | 205 | 7 | A | | 5 | A | 150 | 8 | A | | 1 | A | 125 | 9 | A | | 8 | A | 125 | 10 | A | | 4 | A | 105 | 11 | A | | 17 | B | 195 | 1 | B | | 18 | B | 185 | 2 | B | | 19 | B | 175 | 3 | B | | 20 | B | 165 | 4 | B | | 13 | B | 165 | 5 | B | | 12 | B | 150 | 6 | B | | 14 | B | 145 | 7 | B | | 22 | B | 125 | 8 | B | | 15 | B | 115 | 9 | B | | 21 | B | 115 | 10 | B | | 16 | B | 105 | 11 | B | +------+---------+--------+--------------+-----------------+
В горната заявка използваме временни променливи product_rank и текущ_продукт за да следите последната стойност на ранга и стойността на продукта.
Бонус четене:Как да изчислим маржа в MySQL
След това ще използваме горната заявка като подзаявка, за да изберем топ 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 sales ORDER BY product, amount desc ) ranked_rows where product_rank<=10; +------+---------+--------+ | id | product | amount | +------+---------+--------+ | 9 | A | 350 | | 3 | A | 325 | | 11 | A | 325 | | 10 | A | 235 | | 2 | A | 225 | | 6 | A | 215 | | 7 | A | 205 | | 5 | A | 150 | | 1 | A | 125 | | 8 | A | 125 | | 17 | B | 195 | | 18 | B | 185 | | 19 | B | 175 | | 20 | B | 165 | | 13 | B | 165 | | 12 | B | 150 | | 14 | B | 145 | | 22 | B | 125 | | 15 | B | 115 | | 21 | B | 115 | +------+---------+--------+
Бонус четене:Как да изберете най-продаваните продукти с помощта на SQL
Използвахме условието където product_rank<=10 за да изберете само топ 10 записа. Можете да го промените, за да изберете толкова редове, колкото искате.
Нуждаете се от инструмент за отчитане за MySQL? Ubiq улеснява визуализирането на данни за минути и наблюдение в табла за управление в реално време. Опитайте днес!