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

Cómo seleccionar las primeras N filas por grupo en MySQL

A veces, es posible que deba seleccionar las N filas superiores de cada grupo en MySQL. Aquí se explica cómo seleccionar las N filas superiores por grupo en MySQL. Puede usarlo para obtener los primeros n resultados por grupo, seleccionar los 10 mejores registros para cada categoría o seleccionar el primer registro de cada grupo.

MySQL selecciona las primeras N filas por grupo

Estos son los pasos para seleccionar las N filas superiores por grupo. Supongamos que tiene la siguiente tabla pedidos (id, producto, cantidad)

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

Lectura adicional:Cómo obtener datos de la semana pasada en MySQL

Cómo seleccionar las primeras N filas por grupo en MySQL

Primero, clasificaremos cada fila dentro de su grupo (producto columna) usando la siguiente consulta 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                           |
+------+---------+--------+--------------+-----------------------------+

En la consulta anterior, primero ordenamos cada registro dentro de su grupo por columna de cantidad en orden descendente y luego lo clasificamos. Si desea ordenarlo en orden ascendente de cantidades, puede hacerlo cambiando la cláusula 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;

A continuación, usamos la consulta anterior como una subconsulta para seleccionar las N filas principales por grupo (por ejemplo, las 2 filas principales de cada categoría).

Lectura adicional:base de datos de copia de MySQL

Cómo seleccionar las 2 primeras filas por grupo

Aquí está la consulta SQL para seleccionar las 2 filas superiores para cada grupo usando el método anterior. Usaremos la consulta anterior como subconsulta y seleccionaremos filas cuyo rango sea menor o igual a 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 |
+------+---------+--------+

Lectura adicional:inserción de MySQL en Select

Cómo seleccionar las 10 primeras filas por grupo

Del mismo modo, puede seleccionar las 10 filas principales de cada grupo mediante la siguiente consulta.

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;

Con suerte, ahora puede seleccionar fácilmente las N filas superiores por grupo en MySQL.

Ubiq facilita la visualización de datos en minutos y la supervisión en paneles en tiempo real. ¡Pruébalo hoy!