如何构建具有循环依赖性的 DBT 表

How to structure DBT tables with cyclical dependencies

我有一个 table 包含我的成员。

customer_id name age
1 John 74
2 Sarah 87

每天,我都会收到一个包含当前成员的新 table。

想象一下,我得到一个包含以下行的新上传

customer_id name age
2 Sarah 87
3 Melvin 23

然后我想生成 table

customer_id name age
Null Null 74
2 Sarah 87
3 Melvin 23

我不想错误地取消任何东西,因此我想 运行 在我更换旧的之前对这个 table 进行一些测试。我这样做的方法是创建一个临时的 table(我们称它为 customer_temp)。但是,我现在创建了一个循环依赖,因为我:

我能用 dbt 做到这一点吗?

销毁数据很棘手。我会避免这种情况,除非有必要(例如,符合 DSAR)。

假设每天将新数据加载到数据库中的同一个 table 中,我认为这是快照的理想选择,可以选择使 hard-deleted 记录无效。参见docs。这使您可以捕获 table 的更改历史记录而不会丢失任何数据。

如果您在初始状态下打开快照,您的快照 table 将如下所示(假设现有记录的时间戳为 1/1):

customer_id name age valid_from valid_to
1 John 74 1/1/2022
2 Sarah 87 1/1/2022

然后,在源 table 更新后,re-running dbt snapshot(今天)将创建此 table:

customer_id name age valid_from valid_to
1 John 74 1/1/2022 5/12/2022
2 Sarah 87 1/1/2022
3 Melvin 23 5/12/2022

您可以通过简单的查询创建您喜欢的格式:

select
    case when valid_to is null then customer_id else null end as customer_id,
    case when valid_to is null then name else null end as name,
    age
from {{ ref('my_snapshot') }}