我的第一个 dbt
问题,因为我也是这个框架的新手。
我有以下查询,并且有一个问题,更好地编写它的最佳方法是什么?
我使用 var('partner')
和 uuid
用于 status
列,以及临时表名称 'points_{{partner}}'
问题:
构建和组织它以处理上述 20 多个合作伙伴而不是在 20 个 SQL 文件上重复相同查询的最佳方法是什么?我在这里使用 'points_{{partner}}'
,但最终我希望在目标中存储许多这些合作伙伴特定的视图。
我可以将 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}}'
答案 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 %}
我完全是编造的,因为我不知道您的确切源数据,但您可能已经了解要点。