oracle Oacle SQL查询以查找审计表中已更改的记录

kb5ga3dv  于 2022-11-03  发布在  Oracle
关注(0)|答案(1)|浏览(224)
  • 我尝试过重新组织问题和答案。请不要标记为重复,前面的问题有一个答案(它没有工作),因此我没有删除它 * 我有一个表ANC_PER_ABS_ENTRIES,它具有以下详细信息-

| 每个_AB_条目_标识|人员编号|动作类型|持续时间|开始日期|结束日期|最后更新日期|
| - -|- -|- -|- -|- -|- -|- -|
| 十五个|一百零一|插入|三个|2022年1月10日|2022年10月3日|2022年11月2日下午4:59:43|
| 十五个|一百零一|更新|一个|2022年1月10日|2022年1月10日|2022年11月2日10时59分43秒|
| 十六岁|一百零二|插入|四个|2022年2月10日|2022年5月10日|2022年11月1日上午10时59分43秒|
| 十七岁|一百零三|插入|四个|2022年2月10日|2022年5月10日|2022年11月2日10时59分43秒|
| 十七岁|一百零三|删除了|四个|2022年2月10日|2022年5月10日|2022年11月2日22时59分43秒|
| 十七岁|一百零三|插入|四个|2022年2月10日|2022年5月10日|2022年11月2日23时59分43秒|
此表是一个历史记录表,类似- insert update和delete这样的操作在此表中被跟踪。我希望创建一个查询,通过比较last_update_date,只选取此表中的更改。
例如,对于per_ab_entry_id--〉15的person_number 101,首先插入action_type,然后更新它,并更改end_date
因此,在第一次运行中,选取第一行,在第二次运行中,仅应选取更新的action_type
在删除的情况下,即对于person_number 103,在第一次运行中选取的插入记录已被删除,因此应在下一次运行中选取。
如何使用滞后函数来检查上次运行的最后更新日期,并检查start_dateend_Date中是否有任何变化,如果有插入/更新/删除,我应该返回最新的行。如果是删除,我应该发送删除的行,如果是为同一个per_ab_entry_id创建的新行,我也应该返回。
在最近一次运行中,输出应如下所示-
| 每个_AB_条目_标识|人员编号|动作类型|持续时间|开始日期|结束日期|最后更新日期|
| - -|- -|- -|- -|- -|- -|- -|
| 十五个|一百零一|更新|一个|2022年1月10日|2022年1月10日|2022年11月2日10时59分43秒|
| 十六岁|一百零二|插入|四个|2022年2月10日|2022年5月10日|2022年11月1日上午10时59分43秒|
| 十七岁|一百零三|删除了|四个|2022年2月10日|2022年5月10日|2022年11月2日22时59分43秒|
| 十七岁|一百零三|插入|四个|2022年2月10日|2022年5月10日|2022年11月2日22时59分43秒|
我已经尝试了下面的查询,但它没有给出任何输出-

with anc as 
(
select person_number,
absence_type,
ABSENCE_STATUS,
approval_status_cd,
start_date,
end_date,
duration,
PER_AB_ENTRY_ID,
AUDIT_ACTION_TYPE_,
         row_number() over (order by PER_AB_ENTRY_ID, LAST_UPD_DT) rn

from ANC_PER_ABS_ENTRIES
)

select N1.person_number,
N1.absence_type,
N1.ABSENCE_STATUS,
N1.approval_status_cd,
N1.start_date,
N1.end_date,
N1.duration,
N1.PER_AB_ENTRY_ID,
N1.action_type 
from anc N1,
ANC N2
WHERE 
N1.PER_AB_ENTRY_ID = N2.PER_AB_ENTRY_ID
   and n1.rn + 1 = n2.rn

AND ( n1.start_date <> n2.start_date
    or n1.end_date <> n2.end_date
    or n1.DURATION <> n2.DURATION)

MATCH_RECOGNISE由于数据库错误而无法工作

a5g8bdjr

a5g8bdjr1#

select   PER_AB_ENTRY_ID, person_number, action_type, duration, START_dATE, END_DATE, LAST_UPD_DT
from
(
select   t.*
        ,rank() over (partition by PER_AB_ENTRY_ID order by LAST_UPD_DT desc) rnk

from     t
) t
where    rnk = 1
   or    rnk = 2 and ACTION_TYPE = 'delete'
order by PER_AB_ENTRY_ID, LAST_UPD_DT

| 每个_AB_条目_标识|人员编号|动作类型|持续时间|开始日期|结束日期|最后更新日期|
| - -|- -|- -|- -|- -|- -|- -|
| 十五个|一百零一|更新|一个|2020年1月1022.00.00.000000日|2020年1月10日22.00.00.00000| 2022年11月2日10时59分43秒|
| 十六岁|一百零二|插入|四个|2020年2月1022.00.00.000000日|2000年5月10日|2022年11月1日上午10时59分43秒|
| 十七岁|一百零三|删除了|四个|2020年2月1022.00.00.000000日|2000年5月10日|2022年11月2日22时59分43秒|
| 十七岁|一百零三|插入|四个|2020年2月1022.00.00.000000日|2000年5月10日|2022年11月2日23时59分43秒|
Fiddle

相关问题