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!