sql >> Base de Datos >  >> RDS >> Mysql

Seleccione los 10 registros principales para cada categoría en MySQL

Cuando ejecuta un negocio de comercio electrónico o una tienda en línea, es posible que deba seleccionar los 10 registros principales para cada categoría de productos, marcas, etc. para informes y análisis. En este artículo, veremos cómo seleccionar los 10 registros principales para cada categoría en MySQL.


Seleccione los 10 mejores registros para cada categoría

Estos son los pasos para seleccionar los 10 mejores registros para cada categoría. Digamos que tiene la siguiente tabla ventas (id, producto, fecha_pedido, cantidad) .

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

Lectura adicional:expresión de tabla común en MySQL

Seleccionaremos los 10 registros principales por cantidad columna para cada categoría (producto). Primero, clasificaremos cada fila dentro de su grupo (producto).

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

En la consulta anterior, usamos variables temporales product_rank y producto_actual para realizar un seguimiento del último valor de rango y valor del producto.

Lectura adicional:Cómo calcular el margen en MySQL

A continuación, usaremos la consulta anterior como una subconsulta para seleccionar los 10 registros principales para cada producto.

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

Lectura adicional:Cómo seleccionar los productos más vendidos usando SQL

Hemos usado la condición donde product_rank<=10 para seleccionar solo los 10 mejores registros. Puede modificarlo para seleccionar tantas filas como desee.

¿Necesita una herramienta de informes para MySQL? Ubiq facilita la visualización de datos en minutos y la supervisión en paneles en tiempo real. ¡Pruébalo hoy!