【问题标题】:how to implement SCD type 2 in redshift如何在红移中实现 SCD 类型 2
【发布时间】:2021-11-14 07:24:39
【问题描述】:

我们得到如下数据,创建时间列告诉我们记录的顺序。需要处理整批记录。加工后需要保持SCD类型-2。并维护活动和非活动列。

key data    creation_time (in mili seconds)
k1  abc     2021-09-16 14:17:28.447000
k1  abcd    2021-09-16 18:50:42.676000
k1  abc     2021-09-16 18:50:42.853000
k1  abcd    2021-09-16 18:50:43.141000
k1  abc     2021-09-16 18:50:43.809000
k1  abcd    2021-09-16 18:50:44.288000
k1  abc     2021-09-16 18:50:44.854000

应用 SCD 类型后的输出 - 2.

规则#。传入数据的顺序是基于creation_time的,只有当传入的记录数据发生一些变化并且其active_dtmz(直到秒)为增量值时,才会插入新记录并停用先前的记录。

key data    active_dtmz             inactive_dtmz
k1  abc     2021-09-16 14:17:28     2021-09-16 18:50:42
k1  abcd    2021-09-16 18:50:42     2021-09-16 18:50:43
k1  abc     2021-09-16 18:50:43     2021-09-16 18:50:44
k1  abcd    2021-09-16 18:50:44     3001-01-01 00:00:00

关键点

  1. active-dtmz 只有几秒钟。
  2. 如果下一条记录在同一键的数据方面重复,则忽略。

【问题讨论】:

  • 为什么结果集只有4行?
  • active_dtmz 值不包含毫秒,这就是为什么只有 4 条记录。这是 active_dtmz 应该只包含秒的要求。
  • 。 .问题需要修改(或者你需要提出一个新问题)才能清楚地解释逻辑。 “只有几秒钟”是行不通的。如何处理具有相同秒值的多行?
  • 当然,我添加了更多细节作为规则,如果您还有任何问题,请告诉我。我需要了解它是否可行。感谢您的宝贵时间。

标签: sql stored-procedures amazon-redshift


【解决方案1】:

根据你的描述,你似乎想要lead():

select t.key, t.data, t.creation_time as active_dtmz,
       lead(t.creation_time, 1, '3000-01-01 00:00:00') over (partition by t.key order by t.creation_time) as inactive_dtmz
from t;

但是,为什么您想要的结果只有四行是个谜。

【讨论】:

  • 实际上您已经考虑过 active_dtmz 也有毫秒,但在预期的输出中并非如此,为什么它的行数较少。 active_dtmz 唯一的挑战是只有几秒钟。这就是为什么它使这个问题更加复杂。
  • Gordon,如果您有任何想法,请帮忙。
猜你喜欢
  • 2020-04-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多