sql - 为活动非活动输入数据填充 scd 类型 2 类型的日期
问题描述
我在一个面试练习平台上看到了这个问题,最初认为它是一个空白和孤岛问题,但我无法继续这种逻辑。在名为 Abinitio 的 ETL 工具中,有一个名为 key_change 的函数,我们可以使用它来解决这类问题。但是,我无法在 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;
基本上,这会选择状态发生变化的每一行,然后使用下一行(发生变化的地方)的结束日期。
您对问题性质的困惑可能是由于数据的呈现方式。日期没有排序,这可能会造成混淆。
推荐阅读
- r - 是否有任何 R 函数可以将组中的行转换为列?
- php - 如何使用 PHP 中的特定条件从数组中删除一行
- python - tkinter 中的绑定数量是否有限制?
- r - 在 Zscaler 防火墙后面的 Docker 映像中发出 HTTPS 请求
- android - 快速插入数据时,Android Paging 3 无法立即更新
- amazon-web-services - 如何使用 mqtt.js 连接到 AWS IoT
- python - 我们如何在python中编写一个生成随机但不包括用户输入的简单代码
- r - 如何仅对一列进行排序而不更改其他列?
- javascript - JS:处理列表时的“前”和“后”操作(使用 IIFE ?)
- typescript - 如何修复错误类型错误:无法读取 null 的属性“0”?