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!