sql - 如何根据日期值在渐变维度类型 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 函数,但它们没有给我额外的记录集。任何指针都会有很大帮助。
解决方案
您可以尝试使用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
为结束版本日期。
推荐阅读
- powershell - How to Wix its worked with Power shell (Power shell script with User input and Prompt)?
- objective-c - Display App version in App setting on IOS
- powershell - 在 Power BI 中开发自定义视觉对象
- c# - “集合被修改错误”,但仅在按键而不是按钮单击时使用相同的方法调用
- google-chrome - 谷歌社交身份验证问题
- windows - 第二个程序打开后关闭程序的批处理文件
- processing - 使字符串对程序的其余部分可访问的问题
- javascript - 如何在 Javascript 中的单个地图函数中执行两个操作
- android - 将图像从存储在 Android 中的 Sqlite 数据库中的图像路径上传到服务器
- laravel - 为什么 Laravel 用户在从付款重定向回来后退出?