Às vezes, você pode precisar selecionar as N linhas superiores de cada grupo no MySQL. Veja como selecionar as N linhas principais por grupo no MySQL. Você pode usá-lo para obter os n principais resultados por grupo, selecionar os 10 melhores registros para cada categoria ou selecionar o primeiro registro de cada grupo.
MySQL seleciona as N linhas principais por grupo
Aqui estão as etapas para selecionar as N linhas superiores por grupo. Digamos que você tenha a seguinte tabela pedidos(id, produto, quantidade)
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 | +------+---------+--------+
Bônus de leitura:Como obter dados da última semana no MySQL
Como selecionar as N linhas principais por grupo no MySQL
Primeiro, classificaremos cada linha dentro de seu grupo (produto coluna) usando a seguinte 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 | +------+---------+--------+--------------+-----------------------------+
Na consulta acima, primeiro classificamos cada registro dentro de seu grupo por coluna de quantidade em ordem decrescente e depois os classificamos. Se você quiser classificá-lo em ordem crescente de valores, poderá fazê-lo alterando a 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;
Em seguida, usamos a consulta acima como uma subconsulta, para selecionar as N linhas principais por grupo (por exemplo, as 2 principais linhas para cada categoria).
Bônus de leitura:banco de dados de cópia MySQL
Como selecionar as 2 primeiras linhas por grupo
Aqui está a consulta SQL para selecionar as 2 primeiras linhas de cada grupo usando o método acima. Usaremos a consulta acima como subconsulta e selecionaremos linhas cuja classificação seja menor ou 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 | +------+---------+--------+
Bônus de leitura:MySQL Inserir em Select
Como selecionar as 10 principais linhas por grupo
Da mesma forma, você pode selecionar as 10 principais linhas de cada grupo usando a consulta a seguir.
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;
Espero que agora você possa selecionar facilmente as N linhas principais por grupo no MySQL.
O Ubiq facilita a visualização de dados em minutos e o monitoramento em painéis em tempo real. Experimente hoje!