Kiedy prowadzisz firmę e-commerce lub sklep internetowy, może być konieczne wybranie 10 najlepszych rekordów dla każdej kategorii produktów, marek itp. do raportowania i analizy. W tym artykule przyjrzymy się, jak wybrać 10 najlepszych rekordów dla każdej kategorii w MySQL.
Wybierz 10 najlepszych rekordów dla każdej kategorii
Oto kroki, aby wybrać 10 najlepszych rekordów dla każdej kategorii. Załóżmy, że masz następującą tabelę sprzedaż (identyfikator, produkt, data_zamówienia, kwota) .
mysql> create table sales(id int, product varchar(255), order_date date, amount int); mysql> insert into sales(id, product, order_date, amount) values(1,'A','2021-01-01',125), (2,'A','2021-01-02',225), (3,'A','2021-01-03',325), (4,'A','2021-01-04',105), (5,'A','2021-01-05',150), (6,'A','2021-01-06',215), (7,'A','2021-01-07',205), (8,'A','2021-01-08',125), (9,'A','2021-01-09',350), (10,'A','2021-01-10',235), (11,'A','2021-01-11',325), (12,'B','2021-01-01',150), (13,'B','2021-01-02',165), (14,'B','2021-01-03',145), (15,'B','2021-01-04',115), (16,'B','2021-01-05',105), (17,'B','2021-01-06',195), (18,'B','2021-01-07',185), (19,'B','2021-01-08',175), (20,'B','2021-01-09',165), (21,'B','2021-01-10',115), (22,'B','2021-01-11',125); mysql> select * from sales; +------+---------+------------+--------+ | id | product | order_date | amount | +------+---------+------------+--------+ | 1 | A | 2021-01-01 | 125 | | 2 | A | 2021-01-02 | 225 | | 3 | A | 2021-01-03 | 325 | | 4 | A | 2021-01-04 | 105 | | 5 | A | 2021-01-05 | 150 | | 6 | A | 2021-01-06 | 215 | | 7 | A | 2021-01-07 | 205 | | 8 | A | 2021-01-08 | 125 | | 9 | A | 2021-01-09 | 350 | | 10 | A | 2021-01-10 | 235 | | 11 | A | 2021-01-11 | 325 | | 12 | B | 2021-01-01 | 150 | | 13 | B | 2021-01-02 | 165 | | 14 | B | 2021-01-03 | 145 | | 15 | B | 2021-01-04 | 115 | | 16 | B | 2021-01-05 | 105 | | 17 | B | 2021-01-06 | 195 | | 18 | B | 2021-01-07 | 185 | | 19 | B | 2021-01-08 | 175 | | 20 | B | 2021-01-09 | 165 | | 21 | B | 2021-01-10 | 115 | | 22 | B | 2021-01-11 | 125 | +------+---------+------------+--------+
Przeczytaj dodatkowe:Wspólne wyrażenie tabelowe w MySQL
Wybierzemy 10 najlepszych rekordów według kwoty kolumna dla każdej kategorii (produktu). Najpierw uszeregujemy każdy wiersz w jego grupie (produkt).
mysql> SELECT id, product, amount, @product_rank := IF(@current_product = product, @product_rank + 1, 1) AS product_rank, @current_product := product as current_product FROM product_orders ORDER BY product, amount desc; +------+---------+--------+--------------+-----------------+ | id | product | amount | product_rank | current_product | +------+---------+--------+--------------+-----------------+ | 9 | A | 350 | 1 | A | | 3 | A | 325 | 2 | A | | 11 | A | 325 | 3 | A | | 10 | A | 235 | 4 | A | | 2 | A | 225 | 5 | A | | 6 | A | 215 | 6 | A | | 7 | A | 205 | 7 | A | | 5 | A | 150 | 8 | A | | 1 | A | 125 | 9 | A | | 8 | A | 125 | 10 | A | | 4 | A | 105 | 11 | A | | 17 | B | 195 | 1 | B | | 18 | B | 185 | 2 | B | | 19 | B | 175 | 3 | B | | 20 | B | 165 | 4 | B | | 13 | B | 165 | 5 | B | | 12 | B | 150 | 6 | B | | 14 | B | 145 | 7 | B | | 22 | B | 125 | 8 | B | | 15 | B | 115 | 9 | B | | 21 | B | 115 | 10 | B | | 16 | B | 105 | 11 | B | +------+---------+--------+--------------+-----------------+
W powyższym zapytaniu używamy zmiennych tymczasowych product_rank i aktualny_produkt aby śledzić najnowszą pozycję w rankingu i wartość produktu.
Przeczytaj bonus:Jak obliczyć depozyt zabezpieczający w MySQL
Następnie użyjemy powyższego zapytania jako podzapytania, aby wybrać 10 najlepszych rekordów dla każdego produktu.
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 sales ORDER BY product, amount desc ) ranked_rows where product_rank<=10; +------+---------+--------+ | id | product | amount | +------+---------+--------+ | 9 | A | 350 | | 3 | A | 325 | | 11 | A | 325 | | 10 | A | 235 | | 2 | A | 225 | | 6 | A | 215 | | 7 | A | 205 | | 5 | A | 150 | | 1 | A | 125 | | 8 | A | 125 | | 17 | B | 195 | | 18 | B | 185 | | 19 | B | 175 | | 20 | B | 165 | | 13 | B | 165 | | 12 | B | 150 | | 14 | B | 145 | | 22 | B | 125 | | 15 | B | 115 | | 21 | B | 115 | +------+---------+--------+
Przeczytaj bonus:Jak wybrać najlepiej sprzedające się produkty za pomocą SQL
Użyliśmy warunku gdzie product_rank<=10 aby wybrać tylko 10 najlepszych rekordów. Możesz go zmodyfikować, aby wybrać dowolną liczbę wierszy.
Potrzebujesz narzędzia do raportowania dla MySQL? Ubiq ułatwia wizualizację danych w ciągu kilku minut i monitorowanie w pulpitach nawigacyjnych w czasie rzeczywistym. Wypróbuj już dziś!