sql >> Database >  >> RDS >> Mysql

Hoe de bovenste N rijen per groep te selecteren in MySQL

Soms moet u de bovenste N rijen van elke groep in MySQL selecteren. Hier leest u hoe u de bovenste N rijen per groep in MySQL selecteert. Je kunt het gebruiken om top n resultaten per groep te krijgen, selecteer top 10 record voor elke categorie of selecteer eerste record van elke groep.

MySQL Selecteer Top N rijen per groep

Dit zijn de stappen om de bovenste N rijen per groep te selecteren. Stel dat u de volgende tabel bestellingen(id, product, bedrag) . heeft

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 lezen:hoe u gegevens van vorige week in MySQL kunt krijgen

Hoe de bovenste N rijen per groep te selecteren in MySQL

Eerst rangschikken we elke rij binnen zijn groep (product kolom) met behulp van de volgende SQL-query.

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

In de bovenstaande query hebben we eerst elk record binnen zijn groep gesorteerd op kolom in aflopende volgorde en vervolgens gerangschikt. Als u het in oplopende volgorde van bedragen wilt sorteren, kunt u dit doen door de ORDER by-clausule te wijzigen.

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;

Vervolgens gebruiken we de bovenstaande zoekopdracht als een subquery, om de bovenste N rijen per groep te selecteren (bijvoorbeeld de bovenste 2 rijen voor elke categorie).

Bonus Lezen:MySQL Copy Database

Hoe de bovenste 2 rijen per groep te selecteren

Hier is de SQL-query om de bovenste 2 rijen voor elke groep te selecteren met behulp van de bovenstaande methode. We zullen de bovenstaande query gebruiken als subquery en rijen selecteren waarvan de rangorde kleiner is dan of gelijk is aan 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 lezen:MySQL invoegen in Select

Hoe de top 10 rijen per groep te selecteren

Op dezelfde manier kunt u de top 10 rijen van elke groep selecteren met de volgende zoekopdracht.

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;

Hopelijk kun je nu gemakkelijk de bovenste N rijen per groep selecteren in MySQL.

Ubiq maakt het gemakkelijk om gegevens binnen enkele minuten te visualiseren en in realtime dashboards te controleren. Probeer het vandaag nog!

  1. Hoe gegevens uit een tekstbestand naar de mysql-database te importeren

  2. 4 manieren om te controleren of een tabel bestaat in MariaDB

  3. Hoe kan ik mijn standaarddatabase in SQL Server wijzigen zonder MS SQL Server Management Studio te gebruiken?

  4. Gegevens opvragen uit XML