Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Jak uzyskać pierwszy rekord w każdej grupie w MySQL?

Czasami może być konieczne uzyskanie pierwszego wiersza w każdej grupie lub minimalnego wiersza w grupie. Oto jak uzyskać pierwszy rekord w każdej grupie w MySQL. Możesz również użyć tego zapytania SQL, aby uzyskać pierwszy wiersz w każdej grupie w MySQL, PostgreSQL, SQL Server i Oracle. Możesz go użyć, aby wybrać 1 górny wiersz dla każdej grupy.

Jak uzyskać pierwszy rekord w każdej grupie w MySQL

Oto kroki, aby uzyskać pierwszy 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ć pierwszy rekord w każdej grupie, to znaczy dla każdego produktu. Najpierw używamy GROUP BY, aby uzyskać pierwszą randkę dla każdej grupy.

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      |
+---------+-----------------+

Teraz, gdy znamy pierwszą datę dla każdej grupy, łączymy ten wynik z naszą oryginalną tabelą, aby uzyskać pierwszy rekord według grupy dat.

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 |
+---------+------------+------+

Jeśli chcesz uzyskać ostatni lub najnowszy rekord dla każdej grupy, użyj funkcji MAX zamiast funkcji MIN powyżej.

Przeczytaj bonus:Jak uzyskać ostatni rekord w każdej grupie

Jak wybrać najnowszy rekord dla każdego użytkownika

Podobnie możesz wybrać pierwszy rekord dla każdego użytkownika lub uzyskać najstarszy 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 uzyskać zapis ostatnich 15 dni w MySQL

Najpierw otrzymujemy pierwszą datę dla każdego identyfikatora użytkownika przy użyciu funkcji 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            |
+---------+-----------------------+

Teraz, gdy znamy najstarszą datę dla każdego identyfikatora użytkownika, łączymy ten wynik z naszą oryginalną tabelą, aby uzyskać pierwszy rekord według grupy użytkowników.

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 |
+---------+------------------+------+

Mam nadzieję, że możesz uzyskać pierwszy rekord w każdej grupie w MySQL.

Ubiq ułatwia wizualizację danych w ciągu kilku minut i monitorowanie w pulpitach nawigacyjnych w czasie rzeczywistym. Wypróbuj już dziś!

  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jak zsynchronizować bazę danych SQLite na telefonie z systemem Android z bazą danych MySQL na serwerze?

  2. O Neo4j

  3. Ograniczenia klucza obcego MySQL, kaskadowe usuwanie

  4. Jak wypełnić drugie menu rozwijane na podstawie wyboru pierwszego menu rozwijanego za pomocą jQuery/AJAX i PHP/MySQL?

  5. Kolejność wykonania zapytania / klauzuli MySQL