Mysql
 sql >> база данни >  >> RDS >> Mysql

Как да получите последния запис във всяка група в MySQL

Понякога може да се наложи да изберете най-новия запис или да получите най-новия запис за всяка дата, потребител, идентификатор или друга група. Ето SQL заявката за получаване на последния запис във всяка група в MySQL, тъй като няма вградена функция за нея. Можете също да го използвате, за да изберете последния ред за всяка група в PostgreSQL, SQL Server и Oracle.

Как да получите последния запис във всяка група в MySQL

Ето стъпките за получаване на последния запис във всяка група в MySQL.

Да приемем, че имате таблица product_sales(product, order_date,sale) която съдържа данни за продажбите за множество продукти.

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

Бонус четене:Как да получите запис с максимална стойност в MySQL

Да приемем, че искате да получите последния запис във всяка група, тоест за всеки продукт. Първо използваме GROUP BY, за да получим най-новата дата за всяка група.

mysql> select product,max(order_date) from product_sales group by product;
+---------+-----------------+
| product | max(order_date) |
+---------+-----------------+
| A       | 2020-05-03      |
| B       | 2020-05-03      |
| C       | 2020-05-03      |
+---------+-----------------+

Сега, когато знаем най-новата дата за всяка група, присъединяваме този резултат към нашата оригинална таблица, за да получим последния запис по група дати.

mysql> select product_sales.* from product_sales,
           (select product,max(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 |  150 |
| B       | 2020-05-03 |  250 |
| C       | 2020-05-03 | 1850 |
+---------+------------+------+

Бонус четене:Как да създадете изглед в MySQL

Как да изберете най-новия запис за всеки потребител

По същия начин можете да изберете най-новия запис за всеки потребител или да получите най-новия запис за всеки идентификатор. Да приемем, че имате следната таблица user_data(user_id,transaction_date,sale) с данни за потребителски транзакции

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

Бонус за четене:Как да получите нови потребители на ден в MySQL

Първо, получаваме най-новата дата за всеки потребителски идентификатор, използвайки GROUP BY.

mysql> select user_id,max(transaction_date) from user_data group by user_id;
+---------+-----------------------+
| user_id | max(transaction_date) |
+---------+-----------------------+
|       1 | 2020-05-03            |
|       2 | 2020-05-03            |
|       3 | 2020-05-03            |
+---------+-----------------------+

Сега, когато знаем най-новата дата за всеки потребителски идентификатор, присъединяваме този резултат към нашата оригинална таблица, за да получим най-новия запис по потребителска група.

mysql> select user_data.* from user_data,
                (select user_id,max(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-03       |   15 |
|       2 | 2020-05-03       |   25 |
|       3 | 2020-05-03       |   50 |
+---------+------------------+------+

Надяваме се, че можете да получите последния запис във всяка група в MySQL

  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Ръководство за проектиране на база данни за система за поръчки в ресторант в MySQL

  2. Клауза за MySQL UNION

  3. Хибернация:Автоматично създаване/актуализиране на db таблиците въз основа на класове на обекти

  4. MySQL, по-добре да вмъкнете NULL или празен низ?

  5. Не може да се промени колоната, използвана в ограничение за външен ключ