You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在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;

逻辑说明

  1. source_data读取原始数据,包含需要重复的字段和控制次数的replicate列
  2. number_sequence生成从1到最大重复次数的序列,确保覆盖所有行的重复需求
  3. 通过交叉连接+过滤条件,让每行数据精准重复replicate次
  4. 最终输出仅保留需要重复的业务字段,自动排除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;

逻辑说明

  1. 递归CTE的初始部分加载原始数据,设置初始重复计数
  2. 递归分支不断复制当前行,直到计数等于replicate的设定值
  3. 最终查询仅选取业务字段,自动排除replicate和计数辅助列

内容的提问来源于stack exchange,提问作者Akmal Soliev

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 01:00:13