首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何根据日期值在变化缓慢的维度类型2的中间插入行

如何根据日期值在变化缓慢的维度类型2的中间插入行
EN

Stack Overflow用户
提问于 2020-07-03 06:01:58
回答 2查看 511关注 0票数 0

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

代码语言:javascript
运行
复制
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交易表中有一项记录如下-

代码语言:javascript
运行
复制
Prod_Id  Trans_dt
'1234', '2020-05-15'

SCD2中更新的记录应该是-

代码语言:javascript
运行
复制
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'

我试过使用铅和滞后函数,但他们没有给我额外的记录,set.Any指针将是一个很大的帮助。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-07-03 07:31:18

您需要使用两个查询。首先用于插入记录,然后用于更新日期,如下所示:

创建示例数据

代码语言:javascript
运行
复制
SQL> CREATE TABLE yourTable AS (
  2      SELECT '1234' AS Prod_Id, date '2020-03-10' AS Begin_Version_dt, date '2020-04-09' AS End_version_dt FROM dual UNION ALL
  3      SELECT '1234', date '2020-04-10', date '2020-05-10' FROM dual UNION ALL
  4      SELECT '1234', date '2020-05-11', date '9999-12-31' FROM dual
  5  );

Table created.

SQL>
SQL> CREATE TABLE prod_table as
  2  (SELECT 1234 AS PROD_ID, DATE '2020-05-15' AS TRANS_DATE FROM DUAL);

Table created.

当前数据视图:

代码语言:javascript
运行
复制
SQL> SELECT * FROM YOURTABLE ORDER BY BEGIN_VERSION_DT;

PROD BEGIN_VER END_VERSI
---- --------- ---------
1234 10-MAR-20 09-APR-20
1234 10-APR-20 10-MAY-20
1234 11-MAY-20 31-DEC-99

SQL> select * from prod_table;

   PROD_ID TRANS_DAT
---------- ---------
      1234 15-MAY-20

您正在寻找的查询

代码语言:javascript
运行
复制
SQL> INSERT INTO yourTable Y
  2  SELECT PROD_ID, TRANS_DATE, TRANS_DATE FROM PROD_TABLE;

1 row created.

SQL>
SQL>
SQL> UPDATE YOURTABLE YY
  2     SET END_VERSION_DT = COALESCE(
  3  (SELECT LD_BEGIN_DT
  4    FROM (SELECT Y.BEGIN_VERSION_DT,
  5     Y.PROD_ID,
  6     LEAD(Y.BEGIN_VERSION_DT)
  7  OVER (PARTITION BY Y.PROD_ID
  8  ORDER BY Y.BEGIN_VERSION_DT) - 1 AS LD_BEGIN_DT
  9    FROM YOURTABLE Y) Y
 10    WHERE YY.PROD_ID = Y.PROD_ID
 11  AND YY.BEGIN_VERSION_DT = Y.BEGIN_VERSION_DT),
 12  DATE '9999-12-31');

4 rows updated.

更新数据:

代码语言:javascript
运行
复制
SQL> SELECT * FROM YOURTABLE ORDER BY BEGIN_VERSION_DT;
PROD BEGIN_VER END_VERSI
---- --------- ---------
1234 10-MAR-20 09-APR-20
1234 10-APR-20 10-MAY-20
1234 11-MAY-20 14-MAY-20
1234 15-MAY-20 31-DEC-99
SQL>
票数 0
EN

Stack Overflow用户

发布于 2020-07-03 06:10:24

您可以尝试使用具有默认值的LEAD

代码语言:javascript
运行
复制
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;

Demo

这里的逻辑是,如果可用,我们选择任何非NULL结束版本日期。如果没有可用的结束版本日期,我们将在序列中主导下一个开始日期。如果这也是不可用的,那么我们默认将9999-12-31报告为结束版本日期。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62709365

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档