不幸的是,dbt jinja 对这个问题没有用处,因为它(几乎总是)在 SQL 运行时之前编译,所以它无法访问这些值。
这个可以,但是可以用 Snowflake SQL 解决。基本模式是将值展平,然后进行减法,然后将它们聚合在一起。
这里有一些代码:
with carts as (
select 799235 as customer_id, array_construct('shirt', 'pants', 'glasses') as picked, array_construct('glasses') as unpicked
union
select 799246, array_construct('dress', 'pants', 'glasses'), array_construct('pants', 'dress')
),
picked_expanded as (
select
carts.customer_id,
picked.value::varchar as item
from carts, lateral flatten ( input => carts.picked ) as picked
),
unpicked_expanded as (
select
carts.customer_id,
unpicked.value::varchar as item
from carts, lateral flatten ( input => carts.unpicked ) as unpicked
),
combined as (
select * from picked_expanded
except
select * from unpicked_expanded
),
agg as (
select
customer_id,
array_agg(item) as final_cart
from combined
group by 1
)
select * from agg
结果如下:
| CUSTOMER_ID |
FINAL_CART |
| 799246 |
["glasses"] |
| 799235 |
["shirt", "pants"] |