dbt 处理同一个查询多个 if-else 条件

时间:2021-06-18 18:39:09

标签: sql amazon-redshift dbt

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

我有以下查询,并且有一个问题,更好地编写它的最佳方法是什么?

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

问题:

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

  2. 我可以将 partner 放在 schema.yml 或其他 dbt 文件中,以便我可以加载和引用它吗?关于如何做到这一点的任何例子?通过这种方式,我在考虑不需要与 20 多个合作伙伴一起处理多个 if-else 语句,而只是简单的 {{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}}'

1 个答案:

答案 0 :(得分:0)

现在您正在做一个单一的 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 %}

我完全是编造的,因为我不知道您的确切源数据,但您可能已经了解要点。