首页 > 解决方案 > 为活动非活动输入数据填充 scd 类型 2 类型的日期

问题描述

输入输出

我在一个面试练习平台上看到了这个问题,最初认为它是一个空白和孤岛问题,但我无法继续这种逻辑。在名为 Abinitio 的 ETL 工具中,有一个名为 key_change 的函数,我们可以使用它来解决这类问题。但是,我无法在 sql 中执行此操作。你能帮我解决这个问题吗

标签: sql

解决方案


哇,好久没听过“Ab Initio”了。无论如何,这似乎是一个间隙和孤岛问题,可以使用行号的差异来解决。但是,它也可以通过使用两个滞后且没有聚合的类似方法来解决:

select customer_id, status,
       effective_date,
       lead(effective_date, 1, '2099-12-31') over (partition by customer_id order by effective_date) as end_date
from (select t.*,
             lag(status) over (partition by customer_id order by effective_date) as prev_status
      from t
     ) t
where prev_status is null or prev_status <> status;

基本上,这会选择状态发生变化的每一行,然后使用下一行(发生变化的地方)的结束日期。

您对问题性质的困惑可能是由于数据的呈现方式。日期没有排序,这可能会造成混淆。


推荐阅读