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

如何在Snowflake中按指定数量将单行拆分为多行(每行3个订单号)

在Snowflake中按指定数量拆分逗号分隔的订单号为多行

解决方案SQL

假设你的表名为user_orders,原始字段为user(注意:user是Snowflake关键字,需用双引号引用)和oder_num(推测为order_num的拼写错误),可以用以下SQL实现需求:

WITH split_orders AS (
    SELECT 
        "user" AS user_id,
        TRIM(value) AS single_order,
        ROW_NUMBER() OVER (PARTITION BY "user" ORDER BY seq) AS rn
    FROM user_orders,
         TABLE(STRTOK_SPLIT_TO_TABLE("oder_num", ', '))
),
grouped_orders AS (
    SELECT 
        user_id,
        LIST_AGG(single_order, ', ') WITHIN GROUP (ORDER BY rn) AS grouped_order,
        FLOOR((rn - 1)/3) AS group_id
    FROM split_orders
    GROUP BY user_id, group_id
)
SELECT user_id, grouped_order
FROM grouped_orders
ORDER BY user_id, group_id;

如果你的字段名是user_id和order_num(更规范的命名),直接替换对应字段名即可。

步骤解释

  1. 拆分订单号为单行:
    使用STRTOK_SPLIT_TO_TABLE函数,将逗号加空格分隔的订单号字符串拆分为单独行。TRIM函数用于去除订单号前后可能存在的空格,ROW_NUMBER()按用户分组生成每个订单的序号,确保拆分后的顺序与原列表完全一致。

  2. 按3个一组分组:
    通过FLOOR((rn - 1)/3)计算每个订单所属的组ID——每3个连续的订单会被分配到同一个组,实现批量分组的效果。

  3. 合并组内订单号:
    使用LIST_AGG聚合函数,将同一组内的订单号按原顺序重新合并为逗号分隔的字符串,同时保留用户ID和组ID用于后续排序。

  4. 排序输出:
    最后按用户ID和组ID排序,得到符合预期的多行输出。

测试验证

用你提供的测试数据:

useroder_num
1or-11, or-2, or-3, or-4, or-5, or-6
2or-14, or-25, or-3, or-4, or-5, or-6
3or-1, or-2, or-35, or-46, or-5, or-6

执行上述SQL后,输出结果与预期完全匹配:

1   or-11, or-2, or-3
1   or-4, or-5, or-6
2   or-14, or-25, or-3
2   or-4, or-5, or-6
3   or-1, or-2, or-35
3   or-46, or-5, or-6

内容的提问来源于stack exchange,提问作者Chinki Rai

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 17:53:22