sql >> Database >  >> RDS >> Mysql

Hoe het laatste record in elke groep in MySQL te krijgen?

Soms moet u de meest recente record selecteren of de nieuwste record ophalen voor elke datum, gebruiker, ID of een andere groep. Hier is de SQL-query om het laatste record in elke groep in MySQL te krijgen, omdat er geen ingebouwde functie voor is. Je kunt het ook gebruiken om de laatste rij te selecteren voor elke groep in PostgreSQL, SQL Server &Oracle.

Hoe het laatste record in elke groep in MySQL te krijgen

Dit zijn de stappen om het laatste 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 laatste record in elke groep wilt krijgen, dat wil zeggen voor elk product. Eerst gebruiken we GROUP BY om de meest recente datum voor elke groep te krijgen.

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

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

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

Bonus lezen:weergave maken in MySQL

Hoe de meest recente record voor elke gebruiker te selecteren

Op dezelfde manier kunt u de meest recente record voor elke gebruiker selecteren of de nieuwste record voor elke id ophalen. 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:nieuwe gebruikers per dag krijgen in MySQL

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

Nu we de meest recente datum voor elke gebruikers-ID weten, voegen we dit resultaat samen met onze originele tabel om de nieuwste record per gebruikersgroep te krijgen.

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

Hopelijk krijg je het laatste record in elke groep in MySQL

  1. Hoe LEFT() werkt in MariaDB

  2. De Zombie PerfMon-tellers die nooit sterven!

  3. Tabelruimte SYSMGMTDATA zit VOL in Grid Infrastructure Management Repository (MGMTDB)

  4. Een C#-lijst in een database invoegen met Dapper.NET