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ś!