检查渐变维度 2

Posted

技术标签:

【中文标题】检查渐变维度 2【英文标题】:Checking Slowly Changing Dimension 2 【发布时间】:2021-02-02 16:33:35 【问题描述】:

我有一张如下所示的表格:

根据 Kimball 的说法,一种缓慢变化的维度类型 2。

Key 只是一个代理键,一个使行唯一的键。

如您所见,产品 A 共有三行。 该产品的时间表还可以。随着时间的推移,产品的描述会发生变化。 从 2020 年 1 月 1 日到 2020 年 4 月 1 日,该产品的描述为 ProdA1。 从 2020 年 5 月 1 日到 2020 年 12 月 2 日,此产品的描述为 ProdA2 等。

如果您查看产品 B,您会发现时间线上存在间隙。

我们使用 DB2 V12 z/O。如何检查每个产品的时间表是否存在差距?

试过了,还是不行

with selectie (key, tel) as
  (select product, count(*)
    from PROD_TAB
   group by product
    having count(*) > 1)
Select * from
PROD_TAB A
inner join selectie B
on A.product = B.product
Where not exists
(SELECT 1 from PROD_TAB C
WHERE A.product = C.product
AND A.END_DATE + 1 DAY = C.START_DATE
)

有人知道答案吗?

【问题讨论】:

同一产品有重叠的句点(键 6 和键 7)。这是故意的吗?顺便说一句,请不要张贴图片来显示您的数据。请改用纯文本。 嗨,马克,这也可能是数据质量问题 【参考方案1】:

以下查询返回所有产品的所有空白。 想法是在 START_DATE 之前枚举(RN 列)每个产品中的所有期间,并将每条记录与其下一个期间记录连接起来。

WITH
/*
  MYTAB (PRODUCT, DESCRIPTION, START_DATE, END_DATE) AS
(
            SELECT 'A', 'ProdA1', DATE('2020-01-01'), DATE('2020-01-04') FROM SYSIBM.SYSDUMMY1
  UNION ALL SELECT 'A', 'ProdA2', DATE('2020-01-05'), DATE('2020-02-12') FROM SYSIBM.SYSDUMMY1
  UNION ALL SELECT 'A', 'ProdA3', DATE('2020-02-13'), DATE('2020-12-31') FROM SYSIBM.SYSDUMMY1
  UNION ALL SELECT 'B', 'ProdB1', DATE('2020-01-05'), DATE('2020-01-09') FROM SYSIBM.SYSDUMMY1
  UNION ALL SELECT 'B', 'ProdB2', DATE('2020-01-12'), DATE('2020-03-14') FROM SYSIBM.SYSDUMMY1
  UNION ALL SELECT 'B', 'ProdB3', DATE('2020-03-15'), DATE('2020-04-18') FROM SYSIBM.SYSDUMMY1
  UNION ALL SELECT 'B', 'ProdB4', DATE('2020-04-16'), DATE('2020-05-03') FROM SYSIBM.SYSDUMMY1
)
,
*/
MYTAB_ENUM AS 
(
  SELECT 
    T.*
  , ROWNUMBER() OVER (PARTITION BY PRODUCT ORDER BY START_DATE) RN
  FROM MYTAB T
)
SELECT A.PRODUCT, A.END_DATE + 1 START_DT, B.START_DATE - 1 END_DT
FROM MYTAB_ENUM A
JOIN MYTAB_ENUM B ON B.PRODUCT = A.PRODUCT AND B.RN = A.RN + 1
WHERE A.END_DATE + 1 <> B.START_DATE
AND A.END_DATE < B.START_DATE;  

结果是:

|PRODUCT|START_DT  |END_DT    |
|-------|----------|----------|
|B      |2020-01-10|2020-01-11|

可能是更有效的方式:

WITH MYTAB2 AS
(
SELECT 
  T.*
, LAG(END_DATE) OVER (PARTITION BY PRODUCT ORDER BY START_DATE) END_DATE_PREV
FROM MYTAB T
)
SELECT PRODUCT, END_DATE_PREV + 1 START_DATE, START_DATE - 1 END_DATE
FROM MYTAB2
WHERE END_DATE_PREV + 1 <> START_DATE
AND END_DATE_PREV < START_DATE;

【讨论】:

【参考方案2】:

Thnx Mark,这几天会试试这个。 从未听说过 DB2 V12 for z/O 中的 LAG 会读到它

谢谢

【讨论】:

以上是关于检查渐变维度 2的主要内容,如果未能解决你的问题,请参考以下文章

使用 postgresql 设计一个渐变维度类型 2 脚本

渐变维度 (SCD) 类型 2 的不同场景

Keras 嵌入层 - ValueError:检查输入时出错:预期有 2 个维度,但得到了 (39978, 20, 20)

类型2 渐变维度和查询某个时间点的历史数据

model.predict() == ValueError:检查输入时出错:预期 flatten_input 有 3 个维度,但得到的数组形状为 (1, 2)

检查输入时出错:预期 lstm_1_input 有 3 个维度,但得到了形状为 (5, 3) 的数组