我是DBT和Jinja的新手,想知道是否可以使用SQL查询动态定义列表。而不是手动声明列表的项,如:
{% set myOrders = [123,234, 345, 456, 567] %}
用SQL查询定义列表,如下所示:
{% set myOrders = SELECT DISTINCT OrderNum FROM OrdersTable ORDER BY OrderNum %}
这可能吗?
谢谢!
是的!不像你写的那样,但它是支持的。
首先,需要注意的是,这本身就很困难,因为DBT通常分两个阶段运行:- 模板被编译以进行实际的SQL查询(即所有的Jinja被执行)
- 编译的SQL查询被执行
但是有一个构造{% if execute %},它允许您将编译推迟到执行阶段。
直接将文档中的示例改编为您的用例:
{% set my_orders_query %}
SELECT DISTINCT OrderNum
FROM {{ ref('OrdersTable') }}
ORDER BY OrderNum
{% endset %}
{% set rows = run_query(my_orders_query) %}
{% if execute %}
{# Return the first column #}
{% set myOrders = rows.columns[0].values() %}
{% else %}
{% set myOrders = [] %}
{% endif %}