SQL 查询,用于选取具有上次更新日期条件的前一行和当前行



我有一个表格ANC_PER_ABS_ENTRIES,其中包含以下详细信息-

15 101插入3 01/10/2022 03/10/2022:15 101更新1 01/10/2022 01/10/2022:
PER_AB_ENTRY_ID person_number action_type 持续时间 START_dATE END_DATE LAST_UPD_DT
2022-11-01T0459:43
2022-11-02T1059:43

我知道您想查找最近更新的条目,并显示其整个更改日志(从初始插入开始)。

以下是使用窗口函数执行此操作的一种方法:

select a.*
from (
select a.*, 
max(last_update_date) over(partition by per_ab_entry_id) max_update_date
from anc_per_abs_entries a
) a
where max_update_date >= :process_date
order by per_ab_entry_id, last_update_date

在子查询中,窗口max计算属于同一条目的所有行的最新更新;然后我们可以使用该信息在外部查询中进行过滤。

我不确定您的 SQL 代码末尾的过滤逻辑,问题文本中没有描述,所以我把它分开了 - 您可能需要重新合并它。

尝试从表中创建 CTE,如下所示:

WITH
anc AS
(
Select 
ROW_NUMBER() OVER(Partition By PER_AB_ENTRY_ID, PERSON_NUMBER Order By PER_AB_ENTRY_ID, PERSON_NUMBER, LAST_UPDATE_DATE) "RN", 
Count(*) OVER(Partition By PER_AB_ENTRY_ID, PERSON_NUMBER Order By PER_AB_ENTRY_ID, PERSON_NUMBER) "MAX_RN",
a.*, Max(LAST_UPDATE_DATE) OVER(Partition By PER_AB_ENTRY_ID, PERSON_NUMBER Order By PER_AB_ENTRY_ID, PERSON_NUMBER, LAST_UPDATE_DATE) "MAX_UPD_DATE"
From anc_per_abs_entries a
)

现在您有上次(最大)更新日期以及行号和每人的总行数和条目 id.
主 SQL 应该完成这项工作:

SELECT
a.RN,
a.MAX_RN,
a.PER_AB_ENTRY_ID,
a.PERSON_NUMBER,
a.ACTION_TYPE,
a.DURATION,
a.START_DATE,
a.END_DATE,
a.LAST_UPDATE_DATE,
To_Char(a.MAX_UPD_DATE, 'dd.mm.yyyy hh24:mi:ss') "MAX_UPD_DATE"
FROM 
anc a
WHERE
LAST_UPDATE_DATE <= :process_date
AND
(
(
TRUNC(a.MAX_UPD_DATE) = TRUNC(:process_date) And
a.MAX_UPD_DATE <= :process_date And
a.RN = a.MAX_RN
)
OR
(
TRUNC(a.MAX_UPD_DATE) = TRUNC(:process_date) And
a.MAX_UPD_DATE > :process_date And
a.RN = a.MAX_RN - 1
)
OR
(
TRUNC(a.MAX_UPD_DATE) != TRUNC(:process_date) And
a.MAX_UPD_DATE > :process_date And
a.RN IN(a.MAX_RN, a.MAX_RN - 1)
)
)

现在,您可以调整手术室条件的每个部分以满足您的需求。例如,如果满足第二组条件,我不确定要选择什么。它要么在代码中,要么像这里一样:

...
OR
(
TRUNC(a.MAX_UPD_DATE) = TRUNC(:process_date) And
a.MAX_UPD_DATE > :process_date And
a.RN = CASE WHEN a.MAX_RN > 1 THEN a.MAX_RN - 1 ELSE a.MAX_RN END
)
...

。或任何适合您的内容.
问候...

最新更新