Mysql
 sql >> Datenbank >  >> RDS >> Mysql

So wählen Sie die obersten N-Zeilen pro Gruppe in MySQL aus

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!