Manchmal müssen Sie möglicherweise die obersten N Zeilen aus jeder Gruppe in MySQL auswählen. So wählen Sie die obersten N Zeilen pro Gruppe in MySQL aus. Sie können es verwenden, um die Top-n-Ergebnisse pro Gruppe zu erhalten, die Top-10-Datensätze für jede Kategorie auszuwählen oder den ersten Datensatz jeder Gruppe auszuwählen.
MySQL Top-N-Zeilen pro Gruppe auswählen
Hier sind die Schritte zum Auswählen der oberen N Zeilen pro Gruppe. Nehmen wir an, Sie haben die folgende Tabelle orders(id, product, amount)
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 | +------+---------+--------+
Bonuslektüre:So erhalten Sie Daten der letzten Woche in MySQL
Wie man in MySQL die obersten N Zeilen pro Gruppe auswählt
Zuerst ordnen wir jede Zeile innerhalb ihrer Gruppe (Produkt Spalte) mit der folgenden SQL-Abfrage.
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 der obigen Abfrage haben wir zuerst jeden Datensatz innerhalb seiner Spalte „Gruppe nach Betrag“ in absteigender Reihenfolge sortiert und ihn dann eingestuft. Wenn Sie es in aufsteigender Reihenfolge der Beträge sortieren möchten, können Sie dies tun, indem Sie die ORDER by-Klausel ändern.
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;
Als Nächstes verwenden wir die obige Abfrage als Unterabfrage, um die obersten N Zeilen pro Gruppe auszuwählen (z. B. die obersten 2 Zeilen für jede Kategorie).
Bonus-Lesetext:MySQL-Kopierdatenbank
So wählen Sie die obersten 2 Zeilen pro Gruppe aus
Hier ist die SQL-Abfrage, um die obersten 2 Zeilen für jede Gruppe mit der obigen Methode auszuwählen. Wir verwenden die obige Abfrage als Unterabfrage und wählen Zeilen aus, deren Rang kleiner oder gleich 2 ist.
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-Lesung:MySQL-Insert in Select
So wählen Sie die 10 besten Zeilen pro Gruppe aus
Auf ähnliche Weise können Sie mit der folgenden Abfrage die 10 besten Zeilen aus jeder Gruppe auswählen.
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;
Hoffentlich können Sie jetzt ganz einfach die obersten N Zeilen pro Gruppe in MySQL auswählen.
Ubiq macht es einfach, Daten innerhalb von Minuten zu visualisieren und in Echtzeit-Dashboards zu überwachen. Probieren Sie es noch heute aus!