Nogle gange skal du muligvis vælge den seneste post eller få den seneste post for hver dato, bruger, id eller enhver anden gruppe. Her er SQL-forespørgslen for at få sidste post i hver gruppe i MySQL, da der ikke er nogen indbygget funktion til den. Du kan også bruge den til at vælge sidste række for hver gruppe i PostgreSQL, SQL Server og Oracle.
Sådan får du sidste post i hver gruppe i MySQL
Her er trinene til at få sidste rekord i hver gruppe i MySQL.
Lad os sige, at du har en tabel product_sales(product, order_date,sale) der indeholder salgsdata for flere produkter.
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 Læs:Sådan får du rekord med maks. værdi i MySQL
Lad os sige, at du vil have sidste rekord i hver gruppe, det vil sige for hvert produkt. Først bruger vi GROUP BY for at få seneste dato for hver gruppe.
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 hvor vi kender den seneste dato for hver gruppe, kombinerer vi dette resultat med vores originale tabel for at få seneste rekord efter datogruppe.
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 Læs:Sådan opretter du visning i MySQL
Sådan vælger du den seneste registrering for hver bruger
På samme måde kan du vælge seneste post for hver bruger eller få seneste post for hvert id. Lad os sige, at du har følgende tabel brugerdata(bruger-id, transaktionsdato, udsalg) med brugertransaktionsdata
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 Læs:Sådan får du nye brugere pr. dag i MySQL
Først får vi den seneste dato for hvert bruger-id ved hjælp af 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 hvor vi kender den seneste dato for hvert bruger-id, kombinerer vi dette resultat med vores originale tabel for at få den seneste post efter brugergruppe.
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 | +---------+------------------+------+
Forhåbentlig kan du få sidste rekord i hver gruppe i MySQL