Mysql
 sql >> Database >  >> RDS >> Mysql

Come selezionare le prime N righe per gruppo in MySQL

A volte potrebbe essere necessario selezionare le prime N righe da ciascun gruppo in MySQL. Ecco come selezionare le prime N righe per gruppo in MySQL. Puoi usarlo per ottenere i primi n risultati per gruppo, selezionare i primi 10 record per ogni categoria o selezionare il primo record di ogni gruppo.

MySQL Seleziona le prime N righe per gruppo

Ecco i passaggi per selezionare le prime N righe per gruppo. Supponiamo che tu abbia la seguente tabella ordini(id, prodotto, importo)

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

Bonus Leggi:Come ottenere i dati della scorsa settimana in MySQL

Come selezionare le prime N righe per gruppo in MySQL

Innanzitutto, classificheremo ogni riga all'interno del suo gruppo (prodotto colonna) utilizzando la seguente query 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                           |
+------+---------+--------+--------------+-----------------------------+

Nella query precedente, abbiamo prima ordinato ogni record all'interno del suo gruppo in base alla colonna dell'importo in ordine decrescente, quindi lo abbiamo classificato. Se vuoi ordinarlo in ordine crescente di importi, puoi farlo modificando la clausola 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;

Successivamente, utilizziamo la query precedente come sottoquery, per selezionare le prime N righe per gruppo (ad es. le prime 2 righe per ciascuna categoria).

Bonus Lettura:MySQL Copy Database

Come selezionare le prime 2 righe per gruppo

Ecco la query SQL per selezionare le prime 2 righe per ciascun gruppo utilizzando il metodo sopra. Utilizzeremo la query precedente come sottoquery e selezioneremo le righe il cui rango è inferiore o uguale 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 |
+------+---------+--------+

Bonus Lettura:inserimento MySQL in Select

Come selezionare le prime 10 righe per gruppo

Allo stesso modo, puoi selezionare le prime 10 righe di ciascun gruppo utilizzando la query seguente.

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;

Si spera che ora puoi facilmente selezionare le prime N righe per gruppo in MySQL.

Ubiq semplifica la visualizzazione dei dati in pochi minuti e il monitoraggio in dashboard in tempo reale. Provalo oggi!