如何在 dbt jinja 中将两个表加入字典

Posted

技术标签:

【中文标题】如何在 dbt jinja 中将两个表加入字典【英文标题】:How to join two tables into a dictionary in dbt jinja 【发布时间】:2021-11-11 11:02:09 【问题描述】:

我想在 dbt 中创建一个 for 循环,该循环遍历我数据库中表的两列,并使用两列的每一行中的值创建 case when 语句。就像这样:

% set locations = '%United-States%':'United States', '%USA%':'United States' %

select
    case
        % for feeder, correct in locations.items() %
            when lower(locationname) like feeder then correct
        % endfor %
    end as city
from table

我能够为 feeder 和 correct 创建列表,但我无法将它们合并为字典的键值对来循环遍历它。关于我应该如何做到这一点的任何想法?

【问题讨论】:

嗨!我不确定我是否理解问题,我刚刚编译了该代码并且它工作正常,它显示when lower(locationname) like %United-States% then United States。我唯一缺少的是"correct" 周围的一些引号,如果那应该是一个字符串。我错过了什么吗? 嘿哈维尔,感谢您的回答,我编写的代码工作正常,但不是手动在字典中写入值,而是希望它们成为具有两列并且实时的表的行在我的数据库中,所以我希望它们被动态编码到 for 循环中。 您基本上是在要求 python 的 zip() 函数将两个列表连接到一个字典中,对吗? 【参考方案1】:

听起来你有两个问题:

    从另一个表中获取数据,然后 使用该数据填充 case when 语句。

要记住的重要一点是,dbt-jinja 所做的主要事情是创建一个 SQL 字符串。也就是说,有一个聪明的功能可以让您在 jinja 开始将字符串放在一起之前查询数据库。

想法是:

    从数据库中获取要包含在 SELECT 查询中的值 在呈现语句时将先前提取的值填充到查询中

第一步可能会用到两个宏:

run_query() (docs) 和 dbt-utils'get_query_results_as_dict() (docs)

这样的事情可能会起作用(前提是您已经安装了 dbt-utils:


% set locations_query %
select feeder, correct from my_other_table
% endset %
% set locations = run_query(locations_query) %

select
    case
        -- not sure how this part will work yet....
        % for feeder, correct in locations.items() %
            when lower(locationname) like feeder then correct
        % endfor %
    end as city
from table

【讨论】:

以上是关于如何在 dbt jinja 中将两个表加入字典的主要内容,如果未能解决你的问题,请参考以下文章

dbt - jinja - bigquery - 查询优化

dbt jinja 返回查询结果

如何在Jinja中同时遍历2个元素?

dbt 宏 - 使用 *args/**kwargs

如何在 Python 中将两个列表组合成字典? [复制]

使用 jinja2 时如何将新条目添加到字典对象中?