如何在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(更规范的命名),直接替换对应字段名即可。
步骤解释
拆分订单号为单行:
使用STRTOK_SPLIT_TO_TABLE函数,将逗号加空格分隔的订单号字符串拆分为单独行。TRIM函数用于去除订单号前后可能存在的空格,ROW_NUMBER()按用户分组生成每个订单的序号,确保拆分后的顺序与原列表完全一致。按3个一组分组:
通过FLOOR((rn - 1)/3)计算每个订单所属的组ID——每3个连续的订单会被分配到同一个组,实现批量分组的效果。合并组内订单号:
使用LIST_AGG聚合函数,将同一组内的订单号按原顺序重新合并为逗号分隔的字符串,同时保留用户ID和组ID用于后续排序。排序输出:
最后按用户ID和组ID排序,得到符合预期的多行输出。
测试验证
用你提供的测试数据:
| user | oder_num |
|---|---|
| 1 | or-11, or-2, or-3, or-4, or-5, or-6 |
| 2 | or-14, or-25, or-3, or-4, or-5, or-6 |
| 3 | or-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
相关产品推荐
相关产品推荐

