sql >> Databasteknik >  >> RDS >> Mysql

Hur man får första posten i varje grupp i MySQL

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!

  1. Hur fastighetsproffs kan använda Microsoft Access

  2. Ta bort flera arrayer parallellt

  3. Så här kontrollerar du din PostgreSQL-version

  4. Hur den BINÄRA operatören fungerar i MariaDB