使用 dbt_utils.date_spine 时出现意外的语法错误“with”

1 dbt dbt-utils

我正在尝试使用 dbt_utils.date_spine 宏:

select
  {{ dbt_utils.date_spine(datepart="day", start_date="cast('2019-01-01' as date)", end_date="cast('2020-01-01' as date)") }} as purchase_date
from table(generator(rowcount=>10))
Run Code Online (Sandbox Code Playgroud)

并得到以下错误:

Database Error in model purchase (models/data_generation/purchase.sql)
  001003 (42000): SQL compilation error:
  syntax error line 21 at position 0 unexpected 'with'.
  syntax error line 29 at position 5 unexpected ','.
  compiled SQL at target........purchase.sql
Run Code Online (Sandbox Code Playgroud)

有没有人见过这个?

gas*_*lho 5

恐怕这不是使用/调用该宏的正确方法。

最常见的选项之一是在某处具体化一个表,然后让其他模型引用该表。您可以将其视为 a ,Calendar Table或者如果您想进一步深入,您可以构建自己的Date Dimension

例如,假设您有一个calendar_table模型定义为:

{{
  config(
    materialized = 'table',
    )
}}

{{ dbt_utils.date_spine(
    datepart="day",
    start_date="to_date('01/01/2020', 'mm/dd/yyyy')",
    end_date="to_date('01/01/2027', 'mm/dd/yyyy')"
   )
}}

Run Code Online (Sandbox Code Playgroud)

在数据仓库中构建模型后,您可以在其他模型中引用它,例如:

-- another_model.sql

select * from {{ ref('calendar_table') }}
Run Code Online (Sandbox Code Playgroud)

您还可以具体化calendar_table模型,ephemeral以防您不想在 DW 中构建它。

但如果您不想为此使用单独的模型,则可以与 CTE 一起使用,例如:

with date_spine as (
  {{- dbt_utils.date_spine(
    datepart="day",
    start_date="to_date('01/01/2020', 'mm/dd/yyyy')",
    end_date="to_date('01/01/2027', 'mm/dd/yyyy')"
    )
  -}}
)
, other_cte as (
  ...
)
...
Run Code Online (Sandbox Code Playgroud)

请注意,从宏生成的代码不适合在具体化中使用view。您可能更喜欢用于table此目的。

以下是 dbt discourse 的一些相关帖子:

https://discourse.getdbt.com/t/date-dimensions/735

https://discourse.getdbt.com/t/building-a-calendar-table-using-dbt/325