sql >> データベース >  >> RDS >> Mysql

MySQLの各カテゴリのトップ10レコードを選択

    eコマースビジネスやオンラインストアを運営している場合、レポートと分析のために、製品、ブランドなどのカテゴリごとに上位10件のレコードを選択する必要がある場合があります。この記事では、MySQLの各カテゴリの上位10レコードを選択する方法を見ていきます。


    カテゴリごとに上位10件のレコードを選択

    カテゴリごとに上位10件のレコードを選択する手順は次のとおりです。次のテーブルがあるとしますsales(id、product、order_date、amount)

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

    ボーナス読み取り:MySQLの一般的なテーブル式

    金額で上位10件のレコードを選択します 各カテゴリ(製品)の列。まず、グループ(製品)内の各行をランク付けします。

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

    上記のクエリでは、一時変数 product_rankを使用します およびcurrent_product 最新のランク値と製品値を追跡します。

    ボーナスリード:MySQLでマージンを計算する方法

    次に、上記のクエリをサブクエリとして使用して、各製品の上位10レコードを選択します。

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

    ボーナスリード:SQLを使用して最も売れている製品を選択する方法

    where product_rank <=10という条件を使用しました 上位10件のレコードのみを選択します。必要な数の行を選択するように変更できます。

    MySQL用のレポートツールが必要ですか? Ubiqを使用すると、データを数分で簡単に視覚化し、リアルタイムのダッシュボードで監視できます。今日お試しください。

    1. MariaDBでのRIGHT()のしくみ

    2. Postgresqlでキャリッジリターンと新しい行を削除するにはどうすればよいですか?

    3. sqliteデータベースで日付を並べ替えますか?

    4. PostgreSQLの単一引用符と二重引用符の違いは何ですか?