【问题标题】:dbt to handle the same query multiple if-else conditionsdbt 处理同一个查询多个 if-else 条件
【发布时间】:2021-09-03 11:31:59
【问题描述】:

我的第一个dbt 问题之一,因为我也是这个框架的新手。

我有以下查询,并且有一个问题,最好的方法是什么?

我使用var('partner')uuid 用于status 列,以及临时表名称'points_{{partner}}'

问题:

  1. 为了处理上述 20 多个合作伙伴而不是在 20 个 SQL 文件上重复相同的查询,最好的方法是什么?我在这里使用'points_{{partner}}',但最终我希望将许多这些合作伙伴特定的视图存储在目标中。

  2. 我可以将partner 放在schema.yml 或其他dbt 文件中,以便我可以加载和引用它吗?有关如何执行此操作的任何示例?这样一来,我在考虑不需要有多个 if-else 语句与 20 多个合作伙伴来处理,而只是简单的 {{partner}}

WITH 'points_{{partner}}' AS (
  SELECT
    TO_CHAR(
      TO_DATE(points_timestamp, 'YYYY-MM-DD'),
      'YYYY-MM'
    ) AS "months",
    SUM(points_amount) AS "points_amount",
    CASE
    {% if var('partner') == 'nike' %}
      WHEN uuid = '00000000-d64b-46ea-8454-428279b15064' THEN 'OK'
      WHEN uuid = '11111111-dc9a-493a-b1c0-6a798a4889ac' THEN 'NOT_OK'
    {% elif var('partner') == 'puma' %}
      WHEN uuid = '22222222-9644-4c6f-bcb6-57ae8401dfc0' THEN 'OK'
      WHEN uuid = '33333333-af79-4364-8b26-c8106627c937' THEN 'NOT_OK'
    {% endif %}
    END AS "status"
  FROM
    dbt.raw_points
  WHERE
    {% if var('partner') == 'nike' %}
      partner_uuid = '88888888-cfd3-47f4-b6da-447401aefbae'
    {% elif var('partner') == 'puma' %}
      partner_uuid = '99999999-f345-43e8-a335-a1268969095e'
    {% endif %}
  GROUP BY
    months,
    points_amount,
    status
  ORDER BY
    months DESC
)

SELECT * FROM 'points_{{partner}}'

【问题讨论】:

    标签: sql amazon-redshift dbt


    【解决方案1】:

    现在您正在做一个单一的 cte,它将所有合作伙伴模板化到该单一对象中。 另一种选择是将每个合作伙伴联合在一起的模板 cte。

    (此示例假设您在每个合作伙伴的唯一架构中拥有每个 raw_points 表 - 仓库的软单租户模型)

    例子:

    {% set partners = get_column_values(table=ref('my_distinct_partners'), 
           column='partner_name', max_records=50, filter_column='partner_status', filter_value='OK') %}
    
    {% if partners != '' %}
    
    with partner_group_points as (
    
        {% for partner in partners %}    
    
            SELECT
                TO_CHAR( TO_DATE(points_timestamp, 'YYYY-MM-DD'), 'YYYY-MM') AS "months",
                '{{partner}}' as partner,
                SUM(points_amount) AS "points_amount",
                <custom calculation for status here> as status
            FROM 
                `{{ target.project }}.platform_data_{{partner}}.raw_points`
            GROUP BY
                months,
                points_amount,
                status
            ORDER BY months DESC
            {% if not loop.last %} UNION ALL {% endif %}
    
        {% endfor %}
    )    
    
    SELECT 
    months,
    partner,
    sum(points_amount) as points_amount,
    status
    FROM partner_group_points
    GROUP BY months,partner,status
    
    {% endif %}
    

    我完全是在编造这个,因为我不知道你的确切源数据,但你可能明白了要点。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-12-04
      • 1970-01-01
      • 2020-08-27
      • 2020-05-31
      • 1970-01-01
      • 2014-09-06
      • 2015-04-21
      • 2018-11-07
      相关资源
      最近更新 更多