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!