【问题标题】:comparing in the same table based on latest creation date根据最新创建日期在同一张表中进行比较
【发布时间】:2022-01-17 17:39:57
【问题描述】:
id|code|transaction_date   |amount|status|record_status|creation_date
1 |0001|2021-12-10 00:00:00| 10.00|Succ  |D            |2021-12-10 00:00:00
2 |0001|2021-12-10 00:00:00| 10.00|Fail  |D            |2021-12-11 00:00:00
3 |0001|2021-12-10 00:00:00| 10.00|      |A            |2021-12-12 00:00:00 

我要选择recod_status = A,code = 001,交易日期为2021-12-10'

SELECT * FROM TestTable
WHERE DATE(alloc.trans_date) IN ('2021-12-10') // Need filter by few dates
AND record_status = 'A'
AND code = '001';

但我只希望在相同的代码 = 001 且交易日期为 2021-12-10' 但 record_status = 'D', status = 'Fail' 且 creation_date 是最新的情况下返回记录。

上面的示例将返回第 3 条记录,因为第 2 条记录的 creation_date 是最新的并且 status = 'Fail' 和 record_status = 'D'。

我只是想比较一下最新的creation_date。'

我可以选择record_status = 'D'的最新交易

SELECT * FROM TestTable
WHERE creation_date = (
  SELECT MAX(creation_date)
  FROM TestTable
  WHERE DATE(trans_date) IN ('2021-12-10')
  AND record_status = 'D'
)
AND record_status = 'D'
AND code = '001';

【问题讨论】:

  • 因为第二条记录哪一个creation_date是最新的 ???最新的creation_date 值为'2021-12-12 00:00:00',属于id=3 行,而不是2...
  • 最新的record_status = D
  • 是的,当上一条记录(最新创建日期)状态=失败时,我想返回记录状态=A的最后一条记录
  • 什么是精确 MySQL 版本?如果最后一行有 D,pre-last 有 A,pre-pre-last 有 D,那么你需要返回 pre-last 吗?如果最后一行和前最后一个有 A 和前前最后一个有 D 那么你需要返回最后一个还是前最后一个?
  • MYSQL 5,我只想将第 3 行(record_status=A)与第 2 行进行比较,因为第 2 行是最后创建日期和 record_status=D,并且两者具有相同的交易日期。但仅当第二行状态为“失败”时才返回。我的最后一条 sql 语句是选择 record_status 为 'D' 的最后一条记录

标签: mysql sql


【解决方案1】:

看起来像:

SELECT t1.*  
-- or SELECT t2.* - depends on the task which is unclear for me yet
FROM ( SELECT *
       FROM table
       WHERE DATE(trans_date) = '2021-12-10'
       ORDER BY creation_date DESC LIMIT 1 ) t1
JOIN table t2 ON DATE(t1.trans_date) = DATE(t2.trans_date)
             AND t1.creation_date > t2.creation_date
WHERE t1.record_status = 'A'
  AND t2.record_status = 'D'
  AND NOT EXISTS ( SELECT NULL
                   FROM table t3
                   WHERE DATE(t1.trans_date) = DATE(t3.trans_date)
                     AND t1.creation_date > t3.creation_date
                     AND t3.creation_date > t2.creation_date )

子查询t1 选择最后一行,并进一步检查状态A。 表复制t2选择与子查询中选择的行相邻的行(NOT EXISTS检查之间没有任何行),并进一步检查状态D。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-18
    • 1970-01-01
    • 2020-01-18
    • 2013-05-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多