Mysql
 sql >> Base de données >  >> RDS >> Mysql

Comment obtenir le dernier enregistrement de chaque groupe dans MySQL

Parfois, vous devrez peut-être sélectionner l'enregistrement le plus récent ou obtenir le dernier enregistrement pour chaque date, utilisateur, identifiant ou tout autre groupe. Voici la requête SQL pour obtenir le dernier enregistrement de chaque groupe dans MySQL, car il n'y a pas de fonction intégrée pour cela. Vous pouvez également l'utiliser pour sélectionner la dernière ligne de chaque groupe dans PostgreSQL, SQL Server et Oracle.

Comment obtenir le dernier enregistrement de chaque groupe dans MySQL

Voici les étapes pour obtenir le dernier enregistrement de chaque groupe dans MySQL.

Imaginons que vous disposiez d'un tableau product_sales(product, order_date,sale) qui contient des données de vente pour plusieurs produits.

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

Lecture bonus :comment obtenir un enregistrement avec une valeur maximale dans MySQL

Supposons que vous souhaitiez obtenir le dernier enregistrement de chaque groupe, c'est-à-dire pour chaque produit. Nous utilisons d'abord GROUP BY pour obtenir la date la plus récente pour chaque groupe.

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

Maintenant que nous connaissons la date la plus récente pour chaque groupe, nous joignons ce résultat à notre table d'origine pour obtenir le dernier enregistrement par groupe de dates.

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

Lecture bonus :comment créer une vue dans MySQL

Comment sélectionner l'enregistrement le plus récent pour chaque utilisateur

De même, vous pouvez sélectionner l'enregistrement le plus récent pour chaque utilisateur ou obtenir le dernier enregistrement pour chaque identifiant. Disons que vous avez la table suivante user_data(user_id,transaction_date,sale) avec les données de transaction de l'utilisateur

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

Lecture bonus :comment obtenir de nouveaux utilisateurs par jour dans MySQL

Tout d'abord, nous obtenons la dernière date pour chaque identifiant d'utilisateur à l'aide de GROUP BY.

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

Maintenant que nous connaissons la date la plus récente pour chaque identifiant d'utilisateur, nous joignons ce résultat à notre table d'origine pour obtenir le dernier enregistrement par groupe d'utilisateurs.

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

J'espère que vous pourrez obtenir le dernier enregistrement de chaque groupe dans MySQL