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