首页 > 解决方案 > 如何根据日期值在渐变维度类型 2 的中间插入一行

问题描述

我需要在 SCD-2 表中插入一条记录。我们正在使用 Oracle 12C 的数据库。情况如下 - SCD2 表中的当前记录集 -

Prod_Id Begin_Version_dt End_version_dt
'1234',  '2020-03-10',    '2020-04-09'
'1234',  '2020-04-10',    '2020-05-10'
'1234',  '2020-05-11',    '9999-12-31'

Prod 事务表中有一条记录如下 -

Prod_Id  Trans_dt
'1234', '2020-05-15'

SCD2 中的更新记录集应该是 -

Prod_Id Begin_Version_dt End_version_dt
'1234',  '2020-03-10',    '2020-04-09'
'1234',  '2020-04-10',    '2020-05-10'
'1234',  '2020-05-11',    '2020-05-14'  
'1234',  '2020-05-15',    '9999-12-31'

我尝试过使用 LEAD 和 LAG 函数,但它们没有给我额外的记录集。任何指针都会有很大帮助。

标签: sqloracleplsql

解决方案


您可以尝试使用LEAD默认值:

SELECT
    Prod_Id,
    Begin_Version_dt,
    COALESCE(End_Version_dt,
             LEAD(Begin_Version_dt, 1, date '9999-12-31')
             OVER (PARTITION BY Prod_Id ORDER BY Begin_Version_dt)) AS End_Version_dt
FROM yourTable
ORDER BY
    Prod_Id,
    Begin_Version_dt;

演示

这里的逻辑是我们选择任何非NULL结束版本日期(如果可用)。如果最终版本日期不可用,我们希望在序列中的下一个开始日期前领先。如果这也不可用,那么我们默认报告9999-12-31为结束版本日期。


推荐阅读