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

Comment obtenir le premier enregistrement de chaque groupe dans MySQL

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 !