我有一个表格ANC_PER_ABS_ENTRIES,其中包含以下详细信息-
PER_AB_ENTRY_ID | person_number | action_type | 持续时间 | START_dATE | END_DATE LAST_UPD_DT | |
---|---|---|---|---|---|---|
2022-11-01T04 | :59:43 | |||||
2022-11-02T10 | : | 59: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
)
...
。或任何适合您的内容.
问候...