sql >> Databasteknik >  >> RDS >> Mysql

Hur man väljer Top N rader per grupp i MySQL

Ibland kan du behöva välja topp N rader från varje grupp i MySQL. Så här väljer du de N översta raderna per grupp i MySQL. Du kan använda den för att få topp n resultat per grupp, välja topp 10 post för varje kategori eller välja första posten för varje grupp.

MySQL Välj Top N rader per grupp

Här är stegen för att välja topp N rader per grupp. Låt oss säga att du har följande tabell order(id, produkt, belopp)

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

Bonusläs:Hur man får förra veckans data i MySQL

Hur man väljer de N översta raderna per grupp i MySQL

Först kommer vi att rangordna varje rad inom sin grupp (produkt kolumn) med följande SQL-fråga.

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 ovanstående fråga har vi först sorterat varje post inom sin grupp efter mängdkolumn i fallande ordning och sedan rangordnat den. Om du vill sortera det i stigande beloppsordning, kan du göra det genom att ändra 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;

Därefter använder vi ovanstående fråga som en underfråga för att välja de N översta raderna per grupp (t.ex. de två översta raderna för varje kategori).

Bonus Läs:MySQL Copy Database

Hur man väljer de två översta raderna per grupp

Här är SQL-frågan för att välja de två översta raderna för varje grupp med ovanstående metod. Vi kommer att använda ovanstående fråga som underfråga och välja rader vars rankning är mindre än eller lika 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 Infoga i Select

Hur man väljer topp 10 rader per grupp

På samma sätt kan du välja topp 10 rader från varje grupp med hjälp av följande fråga.

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;

Förhoppningsvis kan du nu enkelt välja topp N rader per grupp i MySQL.

Ubiq gör det enkelt att visualisera data på några minuter och övervaka i realtidsinstrumentpaneler. Prova det idag!

  1. Förstå låsgranularitet i MySQL

  2. Hur man bäst får någons 'rank' från en poängtabell med php och mysql utan looping

  3. Databasen tas inte bort när du avinstallerar Android-appen

  4. Hur man konverterar ett datum-/tidsvärde till en sträng i SQL Server med CONVERT()