Nogle gange kan det være nødvendigt at få første række i hver gruppe eller mindste række pr. gruppe. Sådan får du den første rekord i hver gruppe i MySQL. Du kan også bruge denne SQL-forespørgsel til at få top 1 række i hver gruppe i MySQL, PostgreSQL, SQL Server og Oracle. Du kan bruge den til at vælge den øverste række for hver gruppe.
Sådan får du den første post i hver gruppe i MySQL
Her er trinene til at få den første post 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 første rekord i hver gruppe, det vil sige for hvert produkt. Først bruger vi GROUP BY til at få første date for hver gruppe.
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 hvor vi kender den første dato for hver gruppe, slår vi dette resultat sammen med vores originale tabel for at få første post efter datogruppe.
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 | +---------+------------+------+
Hvis du ønsker at få sidste eller seneste post for hver gruppe, skal du bruge MAX i stedet for MIN-funktionen ovenfor.
Bonuslæser:Sådan får du sidste rekord i hver gruppe
Sådan vælger du den seneste registrering for hver bruger
På samme måde kan du vælge den første post for hver bruger eller få den ældste 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 sidste 15 dages rekord i MySQL
Først får vi den første dato for hvert bruger-id ved hjælp af 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 hvor vi kender den ældste dato for hvert bruger-id, forbinder vi dette resultat med vores originale tabel for at få den første post efter brugergruppe.
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 | +---------+------------------+------+
Forhåbentlig kan du få første rekord i hver gruppe i MySQL.
Ubiq gør det nemt at visualisere data på få minutter og overvåge i dashboards i realtid. Prøv det i dag!