Ibland kan du behöva få första raden i varje grupp eller minsta rad per grupp. Så här får du första posten i varje grupp i MySQL. Du kan också använda den här SQL-frågan för att få översta raden i varje grupp i MySQL, PostgreSQL, SQL Server och Oracle. Du kan använda den för att välja den översta raden för varje grupp.
Hur får du första posten i varje grupp i MySQL
Här är stegen för att få första posten i varje grupp i MySQL.
Låt oss säga att du har en tabell product_sales(product, order_date,sale) som innehåller försäljningsdata för flera 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:Hur man får rekord med maxvärde i MySQL
Låt oss säga att du vill få första posten i varje grupp, det vill säga för varje produkt. Först använder vi GROUP BY för att få första dejten för varje grupp.
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 när vi vet det första datumet för varje grupp sammanfogar vi detta resultat med vår ursprungliga tabell för att få första post efter datumgrupp.
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 | +---------+------------+------+
Om du vill få senaste eller senaste posten för varje grupp, använd MAX istället för MIN-funktionen ovan.
Bonusläs:Hur man får sista posten i varje grupp
Hur man väljer den senaste posten för varje användare
På samma sätt kan du välja första posten för varje användare eller få den äldsta posten för varje id. Anta att du har följande tabell user_data(user_id,transaction_date,sale) med användartransaktionsdata
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:Hur man får senaste 15 dagars rekord i MySQL
Först får vi det första datumet för varje användar-ID med 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 när vi vet det äldsta datumet för varje användar-id, slår vi ihop detta resultat med vår ursprungliga tabell för att få den första posten per användargrupp.
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 | +---------+------------------+------+
Förhoppningsvis kan du få första posten i varje grupp i MySQL.
Ubiq gör det enkelt att visualisera data på några minuter och övervaka i realtidsinstrumentpaneler. Prova det idag!