首页 > 解决方案 > 从一组记录中重新插入失败的记录

问题描述

ID     ERROR    STOCK        TRD_DATE          AUDIT_DATETIME
101692579 Y     US9128      15-AUG-18 00.00.00  15-AUG-18 17.01.07 --gets missed
101692555 Y     US9128      15-AUG-18 00.00.00  15-AUG-18 17.21.07
101692555 Y     US9128      15-AUG-18 00.00.00  15-AUG-18 17.11.07
101692555 Y     US9128      15-AUG-18 00.00.00  15-AUG-18 17.07.35
101692572 Y     US912828    15-AUG-18 00.00.00  15-AUG-18 17.21.07
101692572 Y     US912828    15-AUG-18 00.00.00  15-AUG-18 17.11.07
101692572 Y     US912828    15-AUG-18 00.00.00  15-AUG-18 17.07.35
101692573 Y     US912       15-AUG-18 00.00.00  15-AUG-18 17.21.07
101692573 Y     US912       15-AUG-18 00.00.00  15-AUG-18 17.11.07

表:贸易

我已安排在以下时间运行的作业:

17:00
17:10
17:20
17:30

例如,该作业会查询上Trade表中处于 ERROR 状态的记录,where ERROR = Y然后将这些不良交易重新插入同一个表中,因此为什么在不同的时间表中上表示例中存在重复。目前用于获取这些交易的查询如下所示:

select
a.id,
a.error,
a.stock,
a.trd_date,
a.audit_datetime
from trade a
where to_char(audit_datetime, 'yyyymmdd') = to_char(sysdate, 'yyyymmdd')
and error = 'Y'
and to_char(a.audit_datetime, 'yyyymmddhh24mi') >= (select max(to_char(audit_datetime, 'yyyymmddhh24mi'))-1 from trade) --check for previous run errors

我依靠max(audit_datetime)atm:

我有两个无法纠正的问题:

  1. 例如,当工作在@ 17:10 运行时,我希望能够提取以下记录以重新插入到 Trade 表中,但第一个记录被遗漏了:

    101692579 Y     US9128      15-AUG-18 00.00.00  15-AUG-18 17.01.07 --gets missed
    101692555 Y     US9128      15-AUG-18 00.00.00  15-AUG-18 17.07.35
    101692572 Y     US912828    15-AUG-18 00.00.00  15-AUG-18 17.07.35
    

我知道这是因为我的 sql 中的最后一个过滤器audit_datetime < max(audit_datetime)-1。我可以做些什么来解决这个问题?我不想硬编码任何给定的时间,从它应该从哪里查询。如何更改查询以考虑最小值(我的集合中的第一条记录)?

  1. 我想防止在一次运行中使用正确的改进 sql 插入重复的重新插入,例如不想选择三个并重新插入 @ 17:30 时间表:

      101692572 Y     US912828    15-AUG-18 00.00.00  15-AUG-18 17.21.07
      101692572 Y     US912828    15-AUG-18 00.00.00  15-AUG-18 17.11.07
      101692572 Y     US912828    15-AUG-18 00.00.00  15-AUG-18 17.07.35
    

查询应该查看给定 id 的三个中的最大值,然后只重新插入一个。所以这些是应该在@ 17:30 重新插入的:

101692555 Y     US9128      15-AUG-18 00.00.00  15-AUG-18 17.21.07
101692572 Y     US912828    15-AUG-18 00.00.00  15-AUG-18 17.21.07
101692573 Y     US912       15-AUG-18 00.00.00  15-AUG-18 17.21.07

标签: sqloraclesql-insert

解决方案


推荐阅读