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

在Snowflake中基于关联表数据转换数组列并新增MAP字段

实现Snowflake表中嵌套数组的关联替换需求

需求说明

现有两张Snowflake表:
Table_A(存储嵌套数组格式的关联数据):

IDEMP
1[[1,200], [4,100], [5,60]]
2[[1,200], [2,90], [3,45]]
3[[2,250], [4,200], [5,100]]

Table_B(存储BUILD_ID与NAME的映射关系):

BUILD_IDNAME
1DT_A
2DT_B
3DT_C
4DT_D
5DT_E

需要给Table_A新增MAP列,将EMP数组中每个子数组的第一个元素(BUILD_ID)替换为Table_B中对应的NAME值,最终得到如下结果:

IDEMPMAP
1[[1,200], [4,100], [5,60]][[DT_A, 200], [DT_D, 100], [DT_E, 60]]
2[[1,200], [2,90], [3,45]][[DT_A, 200], [DT_B, 90], [DT_C, 45]]
3[[2,250], [4,200], [5,100]][[DT_B, 250], [DT_D, 200], [DT_E, 100]]

实现SQL语句

SELECT 
    a.ID,
    a.EMP,
    ARRAY_AGG(ARRAY_CONCAT([b.NAME], ARRAY_SLICE(e.value, 1, 2))) AS MAP
FROM Table_A a
, LATERAL FLATTEN(a.EMP) e
LEFT JOIN Table_B b ON e.value[0]::INT = b.BUILD_ID
GROUP BY a.ID, a.EMP
ORDER BY a.ID;

语句解释

  1. LATERAL FLATTEN(a.EMP):将Table_A中EMP列的嵌套数组展开,每一行对应原数组中的一个子数组,e.value即为单个子数组。
  2. LEFT JOIN Table_B b ON e.value[0]::INT = b.BUILD_ID:把子数组第一个元素转为INT类型,关联Table_B匹配对应的NAME值。
  3. ARRAY_CONCAT([b.NAME], ARRAY_SLICE(e.value, 1, 2)):将NAME作为新子数组的首元素,拼接原数组中从索引1开始的数值部分,生成替换后的子数组。
  4. ARRAY_AGG(...):按原表ID和EMP列分组,把替换后的子数组重新聚合为嵌套数组,得到最终的MAP列。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.23 05:06:42