sql >> Database teknologi >  >> RDS >> Mysql

Sådan får du den første post i hver gruppe i MySQL

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!

  1. psql:FATAL:database <bruger> eksisterer ikke

  2. Django prefetch_related med limit

  3. Forskellen i håndteringen af ​​mellemrummene mellem Oracle og SQL Server

  4. Forespørgsel for at hente alle rækker fra forrige måned