Parfois, vous devrez peut-être obtenir la première ligne de chaque groupe ou une ligne minimale par groupe. Voici comment obtenir le premier enregistrement de chaque groupe dans MySQL. Vous pouvez également utiliser cette requête SQL pour obtenir la première ligne de chaque groupe dans MySQL, PostgreSQL, SQL Server et Oracle. Vous pouvez l'utiliser pour sélectionner la première ligne de chaque groupe.
Comment obtenir le premier enregistrement de chaque groupe dans MySQL
Voici les étapes pour obtenir le premier 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 premier enregistrement de chaque groupe, c'est-à-dire pour chaque produit. Nous utilisons d'abord GROUP BY pour obtenir la première date de chaque groupe.
mysql> select product,min(order_date) from product_sales group by product; +---------+-----------------+ | product | max(order_date) | +---------+-----------------+ | A | 2020-05-01 | | B | 2020-05-01 | | C | 2020-05-01 | +---------+-----------------+
Maintenant que nous connaissons la première date de chaque groupe, nous joignons ce résultat à notre table d'origine pour obtenir le premier enregistrement par groupe de dates.
mysql> select product_sales.* from product_sales, (select product,min(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 | 250 | | B | 2020-05-03 | 350 | | C | 2020-05-03 | 1250 | +---------+------------+------+
Si vous souhaitez obtenir le dernier enregistrement ou le plus récent pour chaque groupe, utilisez MAX au lieu de la fonction MIN ci-dessus.
Lecture bonus :comment obtenir le dernier enregistrement de chaque groupe
Comment sélectionner l'enregistrement le plus récent pour chaque utilisateur
De même, vous pouvez sélectionner le premier enregistrement pour chaque utilisateur ou obtenir l'enregistrement le plus ancien 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 l'enregistrement des 15 derniers jours dans MySQL
Tout d'abord, nous obtenons la première date pour chaque identifiant d'utilisateur en utilisant GROUP BY.
mysql> select user_id,min(transaction_date) from user_data group by user_id; +---------+-----------------------+ | user_id | min(transaction_date) | +---------+-----------------------+ | 1 | 2020-05-01 | | 2 | 2020-05-01 | | 3 | 2020-05-01 | +---------+-----------------------+
Maintenant que nous connaissons la date la plus ancienne pour chaque identifiant d'utilisateur, nous joignons ce résultat à notre table d'origine pour obtenir le premier enregistrement par groupe d'utilisateurs.
mysql> select user_data.* from user_data, (select user_id,min(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-01 | 25 | | 2 | 2020-05-01 | 35 | | 3 | 2020-05-01 | 125 | +---------+------------------+------+
J'espère que vous pourrez obtenir le premier enregistrement de chaque groupe dans MySQL.
Ubiq facilite la visualisation des données en quelques minutes et la surveillance dans des tableaux de bord en temps réel. Essayez-le aujourd'hui !