如何用Snowflake SQL将分号分隔字符串转换为多行多列?
Snowflake 拆分混合分隔文本为多行多列
直接上能解决需求的SQL方案:
WITH split_data AS ( -- 清理Contact字段并拆分成单行 SELECT ID, -- 去掉末尾多余分号,避免拆分出空值行 TRIM(value) AS item, -- 给每个ID下的拆分项按顺序编号 ROW_NUMBER() OVER(PARTITION BY ID ORDER BY SEQ) AS rn FROM your_table_name, -- 按分号拆分Contact,生成带顺序的行 TABLE(SPLIT_TO_TABLE(TRIM(Contact, ';'), ';')) ), grouped_data AS ( -- 把每两个连续项(时间+邮箱)归为同一组 SELECT ID, item, -- 用编号整除2得到组ID,确保时间和邮箱配对 CEIL(rn / 2) AS group_id, -- 标记当前项是时间还是邮箱(奇数行=时间,偶数行=邮箱) CASE WHEN rn % 2 = 1 THEN 'TIMESTAMP' ELSE 'EMAIL' END AS item_type FROM split_data ) -- 将组内的项转成目标列 SELECT ID, MAX(CASE WHEN item_type = 'TIMESTAMP' THEN item END) AS "Timestamp", MAX(CASE WHEN item_type = 'EMAIL' THEN item END) AS "Email" FROM grouped_data GROUP BY ID, group_id ORDER BY ID, group_id;
关键逻辑说明:
- 清理拆分:用
TRIM(Contact, ';')去掉字段首尾的冗余分号,再通过SPLIT_TO_TABLE把分号分隔的内容拆成单行,同时保留拆分顺序。 - 分组配对:通过
ROW_NUMBER()给每个ID下的拆分项编号,再用CEIL(rn/2)把每两个连续项归为一组,保证时间和邮箱一一对应。 - 转列聚合:用条件聚合
MAX(CASE...)把组内的时间项和邮箱项分别提取成两列,最终得到目标结构。
如果你的Contact字段末尾没有多余分号,可以去掉TRIM(Contact, ';')里的第二个参数,直接用TRIM(Contact)清理空格即可。
内容的提问来源于stack exchange,提问作者Jung
相关产品推荐
相关产品推荐

