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

Sådan vælger du Top N rækker pr. gruppe i MySQL

Nogle gange skal du muligvis vælge top N rækker fra hver gruppe i MySQL. Sådan vælger du top N rækker pr. gruppe i MySQL. Du kan bruge den til at få top n resultater pr. gruppe, vælge top 10 rekord for hver kategori eller vælge den første post for hver gruppe.

MySQL Vælg Top N rækker pr. gruppe

Her er trinene til at vælge top N rækker pr. gruppe. Lad os sige, at du har følgende tabel ordrer(id, produkt, beløb)

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 Læs:Sådan får du sidste uges data i MySQL

Sådan vælger du Top N rækker pr. gruppe i MySQL

Først rangerer vi hver række i dens gruppe (produkt kolonne) ved hjælp af følgende SQL-forespørgsel.

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

I ovenstående forespørgsel har vi først sorteret hver post i dens gruppe efter beløbskolonne i faldende rækkefølge og derefter rangeret den. Hvis du vil sortere det i stigende rækkefølge af beløb, kan du gøre det ved at ændre ORDER by-klausulen.

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;

Dernæst bruger vi ovenstående forespørgsel som en underforespørgsel til at vælge top N rækker pr. gruppe (f.eks. top 2 rækker for hver kategori).

Bonus Læs:MySQL Copy Database

Sådan vælger du top 2 rækker pr. gruppe

Her er SQL-forespørgslen til at vælge top 2 rækker for hver gruppe ved hjælp af ovenstående metode. Vi bruger ovenstående forespørgsel som underforespørgsel og vælger rækker, hvis rang er mindre end eller lig med 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 Læs:MySQL Indsæt i Select

Sådan vælger du top 10 rækker pr. gruppe

På samme måde kan du vælge top 10 rækker fra hver gruppe ved hjælp af følgende forespørgsel.

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;

Forhåbentlig kan du nu nemt vælge top N rækker pr. gruppe i MySQL.

Ubiq gør det nemt at visualisere data på få minutter og overvåge i dashboards i realtid. Prøv det i dag!

  1. Advarsel:Kan ikke ændre header-oplysninger - headere er allerede sendt ved en fejl

  2. Hvordan udfører man en SSIS-pakke fra .NET?

  3. Konstruktøren SQLiteOpenHelper() er udefineret

  4. Sådan låser du en enkelt række