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!