Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Jak wybrać pierwsze N ​​wierszy na grupę w MySQL?

Czasami może być konieczne wybranie górnych N wierszy z każdej grupy w MySQL. Oto jak wybrać pierwsze N ​​wierszy na grupę w MySQL. Możesz go użyć, aby uzyskać n najlepszych wyników na grupę, wybrać 10 najlepszych rekordów dla każdej kategorii lub wybrać pierwszy rekord z każdej grupy.

MySQL Wybierz pierwsze N ​​wierszy na grupę

Oto kroki, aby wybrać pierwsze N ​​wierszy na grupę. Załóżmy, że masz następującą tabelę zamówienia(id, produkt, ilość)

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 |
+------+---------+--------+

Przeczytaj bonus:Jak uzyskać dane z ostatniego tygodnia w MySQL

Jak wybrać pierwsze N ​​wierszy na grupę w MySQL

Najpierw uszeregujemy każdy wiersz w jego grupie (produkt kolumna) za pomocą następującego zapytania SQL.

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                           |
+------+---------+--------+--------------+-----------------------------+

W powyższym zapytaniu najpierw posortowaliśmy każdy rekord w jego grupie według kolumny kwoty w kolejności malejącej, a następnie uszeregowaliśmy go. Jeśli chcesz posortować je w porządku rosnącym kwot, możesz to zrobić, zmieniając klauzulę ORDER by.

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;

Następnie używamy powyższego zapytania jako podzapytania, aby wybrać pierwsze N ​​wierszy na grupę (np. 2 górne wiersze dla każdej kategorii).

Przeczytaj bonus:baza danych kopii MySQL

Jak wybrać 2 górne wiersze na grupę

Oto zapytanie SQL, aby wybrać 2 górne wiersze dla każdej grupy przy użyciu powyższej metody. Użyjemy powyższego zapytania jako podzapytania i wybierzemy wiersze, których pozycja jest mniejsza lub równa 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 |
+------+---------+--------+

Przeczytaj bonus:MySQL Wstaw do Select

Jak wybrać 10 pierwszych wierszy na grupę

Podobnie możesz wybrać 10 pierwszych wierszy z każdej grupy, korzystając z następującego zapytania.

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;

Mamy nadzieję, że teraz możesz łatwo wybrać pierwsze N ​​wierszy na grupę w MySQL.

Ubiq ułatwia wizualizację danych w ciągu kilku minut i monitorowanie w pulpitach nawigacyjnych w czasie rzeczywistym. Wypróbuj już dziś!

  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Utwórz kolumnę sumy skumulowanej w MySQL

  2. MySQL wybierz współrzędne w zakresie

  3. Jak działa funkcja UNHEX() w MySQL

  4. Czy istnieje sposób na uruchomienie MySQL w pamięci dla przypadków testowych JUnit?

  5. Jak mogę zmienić MariaDB na MySQL w XAMPP?