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

MySQLの各グループで最後のレコードを取得する方法

    場合によっては、日付、ユーザー、ID、またはその他のグループごとに、最新のレコードを選択したり、最新のレコードを取得したりする必要があります。組み込み関数がないため、MySQLの各グループの最後のレコードを取得するSQLクエリを次に示します。これを使用して、PostgreSQL、SQL Server、およびOracleの各グループの最後の行を選択することもできます。

    MySQLの各グループで最後のレコードを取得する方法

    MySQLの各グループの最後のレコードを取得する手順は次のとおりです。

    テーブルがあるとします。product_sales(product、order_date、sale) 複数の製品の販売データが含まれています。

    mysql> create table product_sales(product varchar(255),order_date date, sale int);
    
    mysql> insert into product_sales(product,order_date, sale)
         values('A','2020-05-01',250),
         ('B','2020-05-01',350),
         ('C','2020-05-01',1250),
         ('A','2020-05-02',450),
         ('B','2020-05-02',650),
         ('C','2020-05-02',1050),
         ('A','2020-05-03',150),
         ('B','2020-05-03',250),
         ('C','2020-05-03',1850);
    
    mysql> select * from product_sales;
    +---------+------------+------+
    | product | order_date | sale |
    +---------+------------+------+
    | A       | 2020-05-01 |  250 |
    | B       | 2020-05-01 |  350 |
    | C       | 2020-05-01 | 1250 |
    | A       | 2020-05-02 |  450 |
    | B       | 2020-05-02 |  650 |
    | C       | 2020-05-02 | 1050 |
    | A       | 2020-05-03 |  150 |
    | B       | 2020-05-03 |  250 |
    | C       | 2020-05-03 | 1850 |
    +---------+------------+------+
    

    ボーナスリード:MySQLで最大値のレコードを取得する方法

    各グループ、つまり各製品の最後のレコードを取得したいとします。まず、GROUP BYを使用して、各グループの最新の日付を取得します。

    mysql> select product,max(order_date) from product_sales group by product;
    +---------+-----------------+
    | product | max(order_date) |
    +---------+-----------------+
    | A       | 2020-05-03      |
    | B       | 2020-05-03      |
    | C       | 2020-05-03      |
    +---------+-----------------+
    

    各グループの最新の日付がわかったので、この結果を元のテーブルと結合して、日付グループごとの最新のレコードを取得します。

    mysql> select product_sales.* from product_sales,
               (select product,max(order_date) as order_date
                    from product_sales
                    group by product) max_sales
                 where product_sales.product=max_sales.product
                 and product_sales.order_date=max_sales.order_date;
    +---------+------------+------+
    | product | order_date | sale |
    +---------+------------+------+
    | A       | 2020-05-03 |  150 |
    | B       | 2020-05-03 |  250 |
    | C       | 2020-05-03 | 1850 |
    +---------+------------+------+
    

    ボーナスリード:MySQLでビューを作成する方法

    ユーザーごとに最新のレコードを選択する方法

    同様に、ユーザーごとに最新のレコードを選択するか、IDごとに最新のレコードを取得できます。次のテーブルがあるとしますuser_data(user_id、transaction_date、sale) ユーザートランザクションデータを使用

    mysql> create table user_data(user_id int, transaction_date date, sale int);
    
    mysql> insert into user_data(user_id,transaction_date, sale)
              values('1','2020-05-01',25),
              ('2','2020-05-01',35),
              ('3','2020-05-01',125),
              ('1','2020-05-02',40),
              ('2','2020-05-02',50),
              ('3','2020-05-02',50),
              ('1','2020-05-03',15),
              ('2','2020-05-03',25),
              ('3','2020-05-03',50);
    
    
    mysql> select * from user_data;
    +---------+------------------+------+
    | user_id | transaction_date | sale |
    +---------+------------------+------+
    |       1 | 2020-05-01       |   25 |
    |       2 | 2020-05-01       |   35 |
    |       3 | 2020-05-01       |  125 |
    |       1 | 2020-05-02       |   40 |
    |       2 | 2020-05-02       |   50 |
    |       3 | 2020-05-02       |   50 |
    |       1 | 2020-05-03       |   15 |
    |       2 | 2020-05-03       |   25 |
    |       3 | 2020-05-03       |   50 |
    +---------+------------------+------+
    

    ボーナスリード:MySQLで1日あたりの新規ユーザーを獲得する方法

    まず、GROUPBYを使用して各ユーザーIDの最新の日付を取得します。

    mysql> select user_id,max(transaction_date) from user_data group by user_id;
    +---------+-----------------------+
    | user_id | max(transaction_date) |
    +---------+-----------------------+
    |       1 | 2020-05-03            |
    |       2 | 2020-05-03            |
    |       3 | 2020-05-03            |
    +---------+-----------------------+
    

    各ユーザーIDの最新の日付がわかったので、この結果を元のテーブルと結合して、ユーザーグループごとの最新のレコードを取得します。

    mysql> select user_data.* from user_data,
                    (select user_id,max(transaction_date) as transaction_date
                         from user_data
                         group by user_id) max_user
                      where user_data.user_id=max_user.user_id
                      and user_data.transaction_date=max_user.transaction_date;
    +---------+------------------+------+
    | user_id | transaction_date | sale |
    +---------+------------------+------+
    |       1 | 2020-05-03       |   15 |
    |       2 | 2020-05-03       |   25 |
    |       3 | 2020-05-03       |   50 |
    +---------+------------------+------+
    

    うまくいけば、My​​SQLの各グループの最後のレコードを取得できます

    1. PHPを使用してチェックボックスを選択し、複数の行を削除します

    2. トランザクションログの監視

    3. CREATEOracleプロシージャ

    4. SQLServerデータベースの既存のテーブルに列を追加する