首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >dbt处理相同查询的多个if-dbt条件。

dbt处理相同查询的多个if-dbt条件。
EN

Stack Overflow用户
提问于 2021-06-18 18:39:09
回答 1查看 1.7K关注 0票数 0

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

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

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

问题:

  1. ,什么是最好的方法来构造和组织这个来处理所说的20+合作伙伴,而不是有一个重复的相同的查询对20个SQL文件?我在这里使用'points_{{partner}}',但最终我希望在目的地中存储许多特定于合作伙伴的视图。

  1. ,我可以把partner放在schema.yml或其他dbt文件中,这样我就可以加载和引用它了吗?有关于如何做到这一点的例子吗?以这种方式,我考虑的是不需要使用多个if-else语句来处理20+合作伙伴,而只是简单地使用20+

代码语言:javascript
复制
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}}'
EN

回答 1

Stack Overflow用户

发布于 2021-07-06 23:39:16

现在,您正在执行一个cte,将所有合作伙伴模板到该单个对象中。另一种选择是一个模板cte,将每个合作伙伴结合在一起。

(本例假设在每个合作伙伴的唯一模式中包含每个raw_points表--仓库的一个软的单一租赁模型)

示例:

代码语言:javascript
复制
{% 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 %}

我完全是捏造的,因为我不知道你的确切来源数据,但你可能得到了要点。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68040061

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档