Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Como selecionar as principais N linhas por grupo no MySQL


À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!