在 DBT 中更新 Table

Updating Table in DBT

我有两个 SQL 脚本,正在尝试将它们翻译成 DBT。

问题陈述如下:-

当前解

SQL 脚本 1 创建 table 和 SQL 脚本 2 使用以下查询更新 table

UPDATE T1 
SET C4 = 3.3 WHERE C1 = 'US'

现在,我想将这些创建和更新作业(Script1 和 Script 2)移动到 DBT。

DBT 解决方案

我在DBT中创建了一个名为T1.sql的模型,它在数据库中创建了Table T1,其内容如下:-

SELECT * FROM member;

现在为了根据上述标准更新 table,我将 SELECT 语句写为

Select c1,c2,c3,
case when c1 = ‘US’ then 3.3 else c4 end as c4
from t1

现在的问题是我应该把它放在 SELECT 语句上面的什么地方。我不能放入文件 T1.sql 因为每个 DBT 模型文件应该只有一个 SELECT 语句。如果是新文件,那么文件名应该是什么。我不能有多个名称为 'T1.sql'.

的文件

有没有什么方法可以将这两个操作都包含在 T1.sql 文件中,这样我们就不需要创建任何其他新的 table 来实现这个目标?

这是您的 T1.sql 文件:

SELECT * FROM member

此查询 returns table T1 如您所述。

现在您可以在 dbt 中创建一个新的 sql 文件,例如 T2.sql,这个 T2.sql 将包含以下代码:

select 
t1.*,
case when t1.c1 = ‘US’ then 3.3 else c4 end as c4
from {{ref('T1')}} as t1

这里 T2.sql 文件是 referencing 模型 T1 基本上就是你的 T1.sql 文件。

代码 2 与 CTE 这将是您的整个 t1.sql 文件:根据提供的 case 语句更新您的 c4 值

With initial_data as (
select * from member
)
select 
initital_data.*,
case when initital_data.c1 = ‘US’ then 3.3 else c4 end as c4
from initial_data as t1

如果我对你的问题的理解正确,你需要运行根据外部状态进行不同的查询。

您可以添加一个标志作为 DBT 变量1 并使用不同的查询以防您希望再次更新或创建它。

假设您将变量称为“更新”并且值为布尔值,您可以:

{% if update %}
Select c1,c2,c3,
case when c1 = ‘US’ then 3.3 else c4 end as c4
from t1
{% else %}
SELECT * FROM member;
{% endif %}

您还可以使用以下方法在 sql 文件的开头设置变量:

{% set update = True %}