如何在 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 中将两个表加入字典的主要内容,如果未能解决你的问题,请参考以下文章