【问题标题】:select maximum date of multiple dates选择多个日期的最大日期
【发布时间】:2022-01-19 14:16:05
【问题描述】:

如何获取最大创建日期的行数?

示例数据:

id|code|transaction_date   |amount|record_status|creation_date
1 |0001|2021-12-10 00:00:00| 10.00|D            |2021-12-10 00:00:00
2 |0001|2021-12-10 00:00:00| 10.00|D            |2021-12-11 10:00:00
3 |0002|2021-12-11 00:00:00| 10.00|D            |2021-12-11 00:00:00
4 |0002|2021-12-11 00:00:00| 10.00|D            |2021-12-12 10:00:00 

我想得到这个:

id|code|transaction_date   |amount|record_status|creation_date
2 |0001|2021-12-10 00:00:00| 10.00|D            |2021-12-11 10:00:00
4 |0002|2021-12-11 00:00:00| 10.00|D            |2021-12-12 10:00:00 

我正在尝试这个

SELECT * FROM table1
WHERE (SELECT max(creation_date) from table1 WHERE DATE(transaction_date) = '2021-12-10')
AND record_status = 'D';

但我无法选择我想要的日期范围IN ('2021-12-10', 2021-12-11')

【问题讨论】:

  • 您使用的是哪个 MySQL 版本?
  • 我用的是mysql 5
  • (code,creation_date) 是否被定义为唯一的?如果不是,那么在多行包含相同的最大 creation_date 的情况下,您需要什么输出?
  • 您是否在每个代码的最大创建日期之后?如果是这样,Lateral 是您要查找的表函数:stackoverflow.com/questions/36869221/cross-outer-apply-in-mysql 或带有限制或分析的协同子查询。这也可以通过为代码排序的每个分区分配一个行号来实现,按创建日期降序排列,然后在外部查询中由行号 1 限制。任君挑选……每部作品都有相似的表现;并且根据数据/结构,有些会稍微快一些。

标签: mysql sql


【解决方案1】:

试试:

CREATE TABLE  table1 (
 id int,
 code int,
 transaction_date datetime,
 amount decimal(10,2),
 record_status varchar(2),
 creation_date datetime );

INSERT INTO table1 VALUES

(1,0001,'2021-12-10 00:00:00',10.00,'D','2021-12-10 00:00:00'),
(2,0001,'2021-12-10 00:00:00',10.00,'D','2021-12-11 10:00:00'),
(3,0002,'2021-12-11 00:00:00',10.00,'D','2021-12-11 00:00:00'),
(4,0002,'2021-12-11 00:00:00',10.00,'D','2021-12-12 10:00:00'),
(5,0003,'2021-12-10 00:00:00',10.00,'D','2021-12-11 10:00:00'),
(6,0003,'2021-12-10 00:00:00',10.00,'D','2021-12-16 10:00:00');



SELECT t1.*
FROM table1 t1
WHERE t1.creation_date = ( SELECT  MAX(t2.creation_date)
                           FROM table1 t2
                           WHERE t2.code = t1.code
                         );

结果:

id    code    transaction_date    amount  record_status   creation_date
2 1   2021-12-10 00:00:00 10.00   D   2021-12-11 10:00:00
4 2   2021-12-11 00:00:00 10.00   D   2021-12-12 10:00:00
6 3   2021-12-10 00:00:00 10.00   D   2021-12-16 10:00:00

演示:https://dbfiddle.uk/?rdbms=mysql_8.0&fiddle=3b59835d81c67bc7b366ecce815ce67d

【讨论】:

  • 可以只选择transaction_date的范围吗?
  • @Alvin 您可以在获取最大创建时间的子查询中的where 条件中添加transaction_date。尝试使用您的数据,如果有帮助,请告诉我
  • 您需要一个相关的子查询来确保正确的结果。
  • 这适用于显示的示例数据,但不适用于所有数据,因为另一个 code 的日期可能与子查询返回的日期之一匹配,即使它不是code 的最大日期。
【解决方案2】:

对于使用可以在之间使用的范围,例如:

SELECT * FROM table1
WHERE creation_date IN (
SELECT max(creation_date) from table1
WHERE record_status = 'D'
   AND creation_date between '2021-12-11'
   AND '2021-12-13'
group by DATE(transaction_date))

Example

【讨论】:

    【解决方案3】:
    SELECT *
    FROM table t1
    WHERE NOT EXISTS ( SELECT NULL
                       FROM table t2
                       WHERE t1.code = t2.code
                         AND t1.creation_date < t2.creation_date
                      /* AND t2.record_status = 'D' 
                         AND t2.DATE(transaction_date) = '2021-12-10' */ )
    /* AND record_status = 'D'
       AND DATE(transaction_date) = '2021-12-10' */ ;
    

    【讨论】:

      【解决方案4】:

      怎么样?

      SELECT `table1`.*
      FROM `table1`
      INNER JOIN (
          SELECT `code`, MAX(`creation_date`) AS `max_date`
          FROM `table1`
          WHERE `record_status` = 'D'
          GROUP BY `code`
      ) `latest`
          ON `table1`.`code` = `latest`.`code`
          AND `table1`.`creation_date` = `latest`.`max_date`
      

      这使用派生表来获取每个代码的最大日期。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-09-30
        • 2022-01-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多