数据库:雪花
DBT生成sql模型
我的表中有一个列,其中包含用户拥有的产品 ID 列表。
表:用户
用户 ID | 名字 |
---|---|
u1 | 用户1 |
u2 | 用户2 |
表:产品
产品_id | 产品名称 |
---|---|
1 | A |
2 | B |
3 | C |
表:用户属性
日期 | 用户 ID | 产品列表 |
---|---|---|
2024-12-01 | u1 | 1,2,3 |
2024-12-01 | u2 | 2,3,4 |
2024-12-02 | u1 | 2,3 |
2024-12-02 | u2 | 2,3,4 |
现在,我想返回用户拥有的产品名称
预期产出
日期 | 用户 ID | 产品名称 |
---|---|---|
2024-12-01 | u1 | A、B、C |
2024-12-01 | u2 | B、C、D |
我尝试了此操作,但收到错误无法评估不支持的子查询类型
select *, product_list,
(select listagg(product_name, ',') from products where
product_id in (select value from table(split_to_table(product_list, ',')))
) as product_names
from users_attributes ua
left join users u on ua.user_id = u.user_id
当我尝试在子查询中对product_list进行硬编码时,它可以执行,但当然这不是我想要的。
select *, product_list,
(select listagg(product_name, ',') from products where
product_id in (select value from table(split_to_table('1,2', ',')))
) as product_names
from users u
left join user_attributes ua on u.user_id = ua.user_id
我用 CTE 尝试了这一点,并找到了一种方法来获得您需要的结果。基本上,我解压缩了该产品列表列,将属性加入到产品和用户中,然后再次将其压缩回来。
WITH split_attributes as (
SELECT date,
user_id,
value as product_id
FROM user_attributes, LATERAL SPLIT_TO_TABLE(product_list, ','))
SELECT
users.user_id,
users.name,
split_attributes.date,
LISTAGG(products.product_name,',') AS product_names
FROM users
LEFT JOIN split_attributes
ON split_attributes.user_id = users.user_id
LEFT JOIN products
ON split_attributes.product_id = products.product_id
GROUP BY split_attributes.date, users.user_id, users.user_id;