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