【问题标题】:Updating Table in DBT在 DBT 中更新表
【发布时间】:2021-11-01 02:49:17
【问题描述】:

我有两个 SQL 脚本,正在尝试将它们转换为 DBT。

问题描述如下:-

当前解决方案

1 号 SQL 脚本创建表,2 号 SQL 脚本使用以下查询更新表

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

现在,我想将这些创建和更新作业(脚本 1 和脚本 2)移至 DBT。

DBT解决方案

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

SELECT * FROM member;

现在为了根据上述条件更新表,我将 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 文件中,这样我们就不需要创建任何其他新表来实现这一点?

【问题讨论】:

  • @Gaganoreet 检查下面的代码

标签: sql amazon-redshift dbt


【解决方案1】:

这是您的T1.sql 文件:

SELECT * FROM member

此查询返回您提到的表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

【讨论】:

  • 有没有办法只在一个模型中做到这一点?因为现在我将有一个名为 T2 的表格,其中包含我的更新结果。但最初的要求是更新表 T1
  • @GaganpreetSingh 是你需要的吗?我已经更新了代码
  • 如果您将运行 dbt run --models t1 ,那么此模型将根据需要更新值(case 语句)
  • 抱歉给您带来了困惑,我已经更新了问题以更清楚地说明我的问题
  • @GaganpreetSingh 我认为你可以运行我的应该可以工作的代码 2
【解决方案2】:

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

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

假设您将变量称为“update”并且 value 是布尔值,您可以:

{% 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 %}

【讨论】:

  • 如何在运行时更改“更新”变量的值?或者可能是,我第一次希望该值为 false 然后它应该更改为 true
  • @GaganpreetSingh 您可以将其作为参数传递,如下所示: dbt run --vars '{"updated": True}'
猜你喜欢
  • 2022-01-14
  • 2022-01-09
  • 2023-02-18
  • 2021-05-04
  • 2023-03-13
  • 2023-01-16
  • 2021-11-14
  • 2022-10-14
  • 2021-09-07
相关资源
最近更新 更多