SQL 查询中的未来日期记录逻辑

Future dated record logic in SQL query

提问人:Tech_Girl7819 提问时间:11/17/2023 最后编辑:Tech_Girl7819 更新时间:11/17/2023 访问量:50

问:

我有一个包含步骤详细信息PER_GRADE_STEPS_F_VL表。我在表 ess_request_history 中有一个流程日期列,当我们执行运行此报告的作业时,该列会更新。 当对PER_GRADE_STEPS_F_VL进行的最新更新>= 上次执行ess_request_history时,应提取成绩步骤详细信息。 为此,我创建了以下查询 -

select * from 
(
select grade_step_name,
grade_code,
grade_sequence,
Max(last_update_date) OVER( partition BY GRADE_STEP_ID) max_update_date
grade_effective_start_date
from PER_GRADE_STEPS_F_VL
where :effectivedate between grade_effective_start_date and  grade_effective_end_date
)
 where :attribute = 'N'
or (
  :attribute='Y'
  and max_update_date >=
    (
      (SELECT Max(processstart)
      FROM   fusion.ess_request_history erh,
             fusion.ess_request_property erp
      WHERE  erh.requestid = erp.requestid
      AND state = 12
      AND erp.NAME = 'reportID'
      ))

)

目前,查询运行正常;但是,当 是将来的日期和今天的日期时,会出现一个问题。例如,如果 设置为 01-Dec-2023,而 是 16-Nov-2023,则查询不会捕获此方案。我想修改查询,以便如果查询是 01-Dec-2023,则查询在 01-Dec-2023 执行时返回输出。当前逻辑(其中 是今天的日期)阻止它在 2023 年 12 月 1 日被选中;相反,它会在当前日期被选中。 如何调整查询以解决此问题,并确保它在将来的方案中正常工作?grade_effective_start_datemax_update_dategrade_effective_start_datemax_update_dategrade_effective_start_datemax_update_date

SQL Oracle-SQLD开发商

评论

0赞 Error_2646 11/17/2023
给定运行中“:effectivedate”的值是多少?凭直觉,我会认为这将是今天的日期,或者你控制的任何日期。因此,如果“:effectivedate”是 2023 年 11 月 16 日、2023 年 11 月 16 日,或 2023 年 12 月 1 日之前的任何日期,则不会根据 grade_effective_start_date 和 grade_effective_end_date 之间的日期选择该未来日期记录。但事实绝非如此。
0赞 Error_2646 11/17/2023
另一个需要注意的问题是,由于这些表看起来像 scd2 表,如果未来日期的记录在您推迟拾取时有多个更新插入事件,您可能会完全错过这些过期的记录。因为他们不再满足于grade_effective_start_date和grade_effective_end_date之间。
0赞 Jonas Metzler 11/17/2023
您应该了解哪些情况是可能的,哪些情况需要承保。然后相应地更改子句,例如使用 to 使多个条件成为可能。WHEREOR
0赞 Tech_Girl7819 11/17/2023
@Error_2646 :effectivedate 将是我们传递的日期,默认情况下是 sysdate。你是对的,因为我们在条件 01-dec-2023 之间不会被选中。这就是为什么我正在寻找解决方法的原因
0赞 Error_2646 11/17/2023
@Tech_Girl7819好吧,被“相反,它在当前日期被选中”甩掉了。我读到这是未来日期的记录会比它生效的时间更早地被发现。而 “:attribute” 一定是某种控制,用于控制您是进行增量还是完整快照拉取?

答:

0赞 Bogdan Dincescu 11/17/2023 #1

我认为您应该更改 where 条件,如下所示:

 where :attribute = 'N'
   or (
      :attribute='Y'
      and least(max_update_date,grade_effective_start_date) >=
       (
        (SELECT Max(processstart)
         FROM   fusion.ess_request_history erh,
           fusion.ess_request_property erp
         WHERE  erh.requestid = erp.requestid
         AND state = 12 AND erp.NAME = 'reportID'
       ))

评论

0赞 Tech_Girl7819 11/17/2023
这也将在当前日期触发它
0赞 MT0 11/17/2023 #2

当 是将来的日期和今天的日期时,会出现问题。grade_effective_start_datemax_update_date

您似乎想为以下项添加过滤器:grade_effective_start_date <= SYSDATE AND grade_effective_end_date >= SYSDATE

SELECT *
FROM   (
  SELECT grade_step_name,
         grade_code,
         grade_sequence,
         MAX(last_update_date) OVER (PARTITION BY grade_step_id)
           AS max_update_date,
         grade_effective_start_date
  FROM   PER_GRADE_STEPS_F_VL
  WHERE  :effectivedate BETWEEN grade_effective_start_date
                            AND  grade_effective_end_date
)
WHERE  grade_effective_start_date <= SYSDATE
AND    grade_effective_end_date >= SYSDATE
AND    (  :attribute = 'N'
       OR (
              :attribute='Y'
          AND max_update_date >= (
                SELECT Max(processstart)
                FROM   fusion.ess_request_history erh
                       INNER JOIN fusion.ess_request_property erp
                       ON erh.requestid = erp.requestid
                WHERE  state = 12
                AND    erp.NAME = 'reportID'
              )
          )
       )

您确定查询的最后一部分是正确的吗,因为外部查询和最终子查询之间没有关联,因此您正在查看是否有任何条目进入任何成绩的历史表,而不是检查是否有任何最近进入特定成绩的历史表?

评论

0赞 Tech_Girl7819 11/17/2023
外部联接查询用于检查报表的上次成功运行,日期处理日期将从那里开始,之后所做的任何更改将仅在主查询中选取