在dbt+Redshift中实现Polars的repeat_by和explode功能
在dbt+Redshift中实现Polars的repeat_by+explode效果
以下是两种适配Redshift特性的实现方案,均满足你不需要输出replicate列的需求:
方法一:使用generate_series交叉连接
适合replicate数值范围较小的场景,逻辑直观简洁:
WITH source_data AS ( SELECT name, age, city, replicate FROM {{ ref('your_source_table') }} -- 替换为你的源表dbt引用 ), number_sequence AS ( -- 生成覆盖所有可能重复次数的整数序列 SELECT generate_series(1, (SELECT MAX(replicate) FROM source_data)) AS seq_num ) SELECT sd.name, sd.age, sd.city FROM source_data sd CROSS JOIN number_sequence ns WHERE ns.seq_num <= sd.replicate ORDER BY sd.name, ns.seq_num;
逻辑说明
source_data读取原始数据,包含需要重复的字段和控制次数的replicate列number_sequence生成从1到最大重复次数的序列,确保覆盖所有行的重复需求- 通过交叉连接+过滤条件,让每行数据精准重复
replicate次 - 最终输出仅保留需要重复的业务字段,自动排除
replicate列
方法二:递归CTE
当replicate数值较大时,递归CTE的性能更稳定,避免生成过大的序列表:
WITH RECURSIVE replicated_records AS ( -- 初始行:读取原始数据,初始化重复计数为1 SELECT name, age, city, replicate, 1 AS current_repeat FROM {{ ref('your_source_table') }} -- 替换为你的源表dbt引用 WHERE replicate >= 1 -- 过滤无需重复的行(若存在) UNION ALL -- 递归逻辑:逐次复制行,直到计数达到replicate值 SELECT name, age, city, replicate, current_repeat + 1 FROM replicated_records WHERE current_repeat < replicate ) SELECT name, age, city FROM replicated_records ORDER BY name, current_repeat;
逻辑说明
- 递归CTE的初始部分加载原始数据,设置初始重复计数
- 递归分支不断复制当前行,直到计数等于
replicate的设定值 - 最终查询仅选取业务字段,自动排除
replicate和计数辅助列
内容的提问来源于stack exchange,提问作者Akmal Soliev
相关产品推荐
相关产品推荐

