Czasami może zajść potrzeba wybrania najnowszego rekordu lub pobrania najnowszego rekordu dla każdej daty, użytkownika, identyfikatora lub dowolnej innej grupy. Oto zapytanie SQL, aby uzyskać ostatni rekord w każdej grupie w MySQL, ponieważ nie ma dla niego wbudowanej funkcji. Możesz go również użyć do wybrania ostatniego wiersza dla każdej grupy w PostgreSQL, SQL Server i Oracle.
Jak uzyskać ostatni rekord w każdej grupie w MySQL
Oto kroki, aby uzyskać ostatni rekord w każdej grupie w MySQL.
Załóżmy, że masz tabelę product_sales(product, order_date,sale) który zawiera dane sprzedaży dla wielu produktów.
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 | +---------+------------+------+
Przeczytaj bonus:Jak uzyskać rekord z maksymalną wartością w MySQL
Powiedzmy, że chcesz uzyskać ostatni rekord w każdej grupie, to znaczy dla każdego produktu. Najpierw używamy GROUP BY, aby uzyskać najnowszą datę dla każdej grupy.
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 | +---------+-----------------+
Teraz, gdy znamy najnowszą datę dla każdej grupy, łączymy ten wynik z naszą oryginalną tabelą, aby uzyskać najnowszy rekord według grupy dat.
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 | +---------+------------+------+
Przeczytaj bonus:Jak utworzyć widok w MySQL
Jak wybrać najnowszy rekord dla każdego użytkownika
Podobnie możesz wybrać najnowszy rekord dla każdego użytkownika lub uzyskać najnowszy rekord dla każdego identyfikatora. Załóżmy, że masz następującą tabelę dane_użytkownika(identyfikator_użytkownika,data_transakcji,wyprzedaż) z danymi transakcji użytkownika
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 | +---------+------------------+------+
Przeczytaj bonus:Jak zdobywać nowych użytkowników dziennie w MySQL
Najpierw otrzymujemy najnowszą datę dla każdego identyfikatora użytkownika za pomocą funkcji 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 | +---------+-----------------------+
Teraz, gdy znamy najnowszą datę dla każdego identyfikatora użytkownika, łączymy ten wynik z naszą oryginalną tabelą, aby uzyskać najnowszy rekord według grupy użytkowników.
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 | +---------+------------------+------+
Mam nadzieję, że możesz uzyskać ostatni rekord w każdej grupie w MySQL