sql >> Database >  >> RDS >> Mysql

Hoe krijg ik het eerste record in elke groep in MySQL

Soms moet u de eerste rij in elke groep of de minimale rij per groep krijgen. Hier leest u hoe u het eerste record in elke groep in MySQL kunt krijgen. U kunt deze SQL-query ook gebruiken om de bovenste rij van elke groep in MySQL, PostgreSQL, SQL Server en Oracle te krijgen. Je kunt het gebruiken om de eerste rij voor elke groep te selecteren.

Hoe krijg ik het eerste record in elke groep in MySQL

Dit zijn de stappen om het eerste record in elke groep in MySQL te krijgen.

Stel dat u een tabel heeft product_sales(product, order_date,sale) die verkoopgegevens voor meerdere producten bevat.

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

Bonus lezen:hoe u een record met maximale waarde in MySQL kunt krijgen

Stel dat u het eerste record in elke groep wilt krijgen, dat wil zeggen voor elk product. Eerst gebruiken we GROUP BY om de eerste date voor elke groep te krijgen.

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

Nu we de eerste datum voor elke groep weten, voegen we dit resultaat samen met onze originele tabel om de eerste record op datumgroep te krijgen.

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

Als u de laatste of meest recente record voor elke groep wilt krijgen, gebruikt u de MAX-functie in plaats van de MIN-functie hierboven.

Bonus lezen:hoe u het laatste record in elke groep kunt krijgen

Hoe de meest recente record voor elke gebruiker te selecteren

Op dezelfde manier kunt u de eerste record voor elke gebruiker selecteren of de oudste record voor elke id krijgen. Stel dat u de volgende tabel user_data(user_id,transaction_date,sale) heeft met gebruikerstransactiegegevens

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

Bonus lezen:hoe u een record van de laatste 15 dagen in MySQL kunt krijgen

Eerst krijgen we de eerste datum voor elke gebruikers-ID met 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            |
+---------+-----------------------+

Nu we de oudste datum voor elke gebruikers-ID weten, voegen we dit resultaat samen met onze oorspronkelijke tabel om de eerste record per gebruikersgroep te krijgen.

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

Hopelijk kun je het eerste record in elke groep in MySQL krijgen.

Ubiq maakt het gemakkelijk om gegevens binnen enkele minuten te visualiseren en in realtime dashboards te controleren. Probeer het vandaag nog!

  1. PostgreSQL Meest recente invoer selecteren voor een gegeven ID

  2. Het verschil tussen een JDBC-verklaring en een voorbereide verklaring

  3. Follow-up #1 op leidende wildcard-zoekopdrachten

  4. Een schemagebonden opgeslagen procedure maken in SQL Server