提问人:Ashok KS 提问时间:11/14/2023 更新时间:11/14/2023 访问量:42
在 BigQuery 中创建包含历史记录表的effective_from_date和effective_to_date的表格
Create table with effective_from_date and effective_to_date from history table in BigQuery
问:
我有一个表,其中为更改附加了数据。没有删除或更新,只有追加由云运行作业完成。
基表
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 执行此操作的方法,但找不到任何方法。
答:
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 子句传递。
上一个:BQ 中 SQL 的执行顺序
下一个:大查询 SQL 中的数组拆分
评论