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!