sql >> Databáze >  >> RDS >> Mysql

Vyberte 10 nejlepších záznamů pro každou kategorii v MySQL

Když provozujete elektronický obchod nebo internetový obchod, možná budete muset vybrat 10 nejlepších záznamů pro každou kategorii produktů, značek atd. pro vytváření přehledů a analýzy. V tomto článku se podíváme na to, jak vybrat 10 nejlepších záznamů pro každou kategorii v MySQL.


Vyberte 10 nejlepších záznamů pro každou kategorii

Zde jsou kroky k výběru 10 nejlepších záznamů pro každou kategorii. Řekněme, že máte následující tabulku prodej (id, produkt, datum_objednávky, částka) .

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 |
 +------+---------+------------+--------+

Bonusové čtení:Společný tabulkový výraz v MySQL

Vybereme 10 nejlepších záznamů podle částky sloupec pro každou kategorii (produkt). Nejprve seřadíme každý řádek v rámci jeho skupiny (produktu).

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               |
 +------+---------+--------+--------------+-----------------+

Ve výše uvedeném dotazu používáme dočasné proměnné product_rank a aktuální_produkt sledovat nejnovější hodnotu pořadí a hodnotu produktu.

Bonusové čtení:Jak vypočítat marži v MySQL

Dále použijeme výše uvedený dotaz jako dílčí dotaz k výběru 10 nejlepších záznamů pro každý produkt.

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 |
 +------+---------+--------+

Bonusové čtení:Jak vybrat nejprodávanější produkty pomocí SQL

Použili jsme podmínku where product_rank<=10 vyberte pouze 10 nejlepších záznamů. Můžete jej upravit a vybrat tolik řádků, kolik chcete.

Potřebujete nástroj pro vytváření sestav pro MySQL? Ubiq usnadňuje vizualizaci dat během několika minut a sledování na řídicích panelech v reálném čase. Vyzkoušejte to ještě dnes!

  1. Velikost tabulky oddílů v PostgreSQL 9.0

  2. Nejlepší přístup k odstranění časové části datatime na serveru SQL Server

  3. Je možné spustit řetězec v MySQL?

  4. Šifrujte data v SQLite