我正在尝试使用dbt宏来转换调查结果。
我有一张类似于的表格
column1 | column2 | |
---|---|---|
经常 | ||
从不 | 始终 | |
感谢您花时间交流您的问题。这并不容易!当谈到dbt和Jinja:时,你似乎正在经历一个头号误解
Jinja不是要转换数据,而是要组成一个将发送到数据库的SQL查询。在jinja的花括号中的所有内容都被渲染后,您将得到一个可以发送到数据库的查询。
这个概念在像run_query
(docs(这样的dbt宏中确实变得复杂,这些宏将进入数据库并获取信息。但是您获取的信息只能用于生成SQL字符串。
如果您使用Python的panda,那么您的示例听起来就像是在内存中进行转换的方法。在dbt-land中,只有字符串生成发生在内存中,尽管有时我们在进行新查询之前会从数据库中获取一些子字符串。因此,听起来您希望Jinja查看列中的每个值并进行替换,您真正需要做的是生成一个查询,指示数据库进行替换。我们在SQL中进行替换的方法是使用CASE WHEN
语句(有关更多信息,请参阅Mode的CASE文档(
这可能更接近你想要的。请注意,最好将likert_map
对象放入dbt种子表中。
{% set likert_map =
{"1": "always", "2": "often", "3": "sometimes", "4": "never"} %}
SELECT
CASE column_1
{% for key, value in likert_map.items() %}
WHEN '{{ value }}' THEN '{{ key }}'
{% endfor %}
ELSE 0 END AS column_1_new,
CASE column_2
{% for key, value in likert_map.items() %}
WHEN '{{ value }}' THEN '{{ key }}'
{% endfor %}
ELSE 0 END AS column_2_new
{% endfor %}
FROM
table
以下是一些使用映射字典信息进行SQL查询的相关问题:
- 如何在dbt-jinja中将两个表连接到字典中
- DBT-针对以数字为变量的循环问题