在 BigQuery 中创建包含历史记录表的effective_from_date和effective_to_date的表格

Create table with effective_from_date and effective_to_date from history table in BigQuery

提问人:Ashok KS 提问时间:11/14/2023 更新时间:11/14/2023 访问量:42

问:

我有一个表,其中为更改附加了数据。没有删除或更新,只有追加由云运行作业完成。

基表

Supplier_ID Supplier_Name Supplier_Contact Last_Modified
123 美国广播公司 03 483 394 2023-05-01 12:34:56
124 ABD公司 02 848 939 2023-05-01 12:34:56
123 美国广播公司 03 483 345 2023-05-02 10:45:05
124 ABD公司 02 848 837 2023-05-02 10:45:05
123 美国广播公司 03 478 102 2023-05-08 11:09:15

我想创建另一个如下所示的表。

Supplier_ID Supplier_Name Supplier_Contact Effective_From Effective_To is_active
123 美国广播公司 03 483 394 2023-05-01 12:34:56 2023-05-02 10:45:05 N
123 美国广播公司 03 483 345 2023-05-02 10:45:05 2023-05-08 11:09:15 N
123 美国广播公司 03 478 102 2023-05-08 11:09:15 9999-12-21 00:00:00 Y
124 ABD公司 02 848 939 2023-05-01 12:34:56 2023-05-02 10:45:05 N
124 ABD公司 02 848 837 2023-05-02 10:45:05 9999-12-21 00:00:00 Y

实现目标的最佳方式是什么?我试图找到一种使用 dbt 执行此操作的方法,但找不到任何方法。

sql google-bigquery sql-update dbt scd

评论


答:

0赞 Println 11/14/2023 #1

您可以使用下面的查询作为参考,并在 dbt 中创建模型

    with raw as (
    select 
    '123' as Supplier_ID, 'ABC' as Supplier_Name, '03 483 394' as Supplier_Contact, cast('2023-05-01 12:34:56' as datetime) as Last_Modified
    union all 
    select 
    '124' as Supplier_ID, 'ABD' as Supplier_Name, '02 848 939' as Supplier_Contact, cast('2023-05-01 12:34:56' as datetime) as Last_Modified
    union all
    select 
    '123' as Supplier_ID, 'ABC' as Supplier_Name, '03 483 345' as Supplier_Contact, cast('2023-05-02 10:45:05' as datetime) as Last_Modified
    union all
    select 
    '124' as Supplier_ID, 'ABD' as Supplier_Name, '02 848 837' as Supplier_Contact, cast('2023-05-02 10:45:05' as datetime) as Last_Modified
    union all
    select 
    '123' as Supplier_ID, 'ABC' as Supplier_Name, '03 478 102' as Supplier_Contact, cast('2023-05-08 11:09:15' as datetime) as Last_Modified
    ),
    raw2 as (
    select Supplier_ID,Supplier_Name,Supplier_Contact,Last_Modified as Effective_From,lead(Last_Modified) OVER (partition by raw.Supplier_ID ORDER BY raw.Supplier_ID,raw.Last_Modified asc) as Effective_To   from raw order by raw.Supplier_ID,raw.Last_Modified asc
    )
    select *EXCEPT(Effective_To),ifnull(raw2.Effective_From,'9999-12-21 00:00:00') as Effective_To,
if(raw2.Effective_To is null, 'Y','N') as is_active
 from raw2

评论

0赞 Ashok KS 11/14/2023
如何使用 dbt 增量策略实现这一点?我的表大小会不断增加,最好是进行增量更新,而不是每次都刷新整个表。目前,这张桌子的规模为700万,并且每天都在增长。
0赞 Println 11/14/2023
你可以只保留 active_records='Y' 为什么你需要所有记录,有什么具体原因吗@AshokKS
0赞 Ashok KS 11/15/2023
我想要它们,因为我需要传递过去的日期并获取在此期间哪些记录处于活动状态。因此,例如,如果我想知道截至 10 月 5 日的Supplier_Contact,我可以将日期作为 effective_from 列和 effective_to 列的 between 子句传递。