如何在Snowflake/SQL中为两列值关联关系分配原始ID
在Snowflake中为关联记录组分配原始ID的实现方案
现有两组关联记录:第一组为111→222→333→444,第二组为1111→2222,输入表结构及数据如下:
| CLAIM_ID | ADJ_ID |
|---|---|
| 111 | NULL |
| 111 | NULL |
| 222 | 111 |
| 222 | 111 |
| 333 | 222 |
| 333 | 222 |
| 444 | 333 |
| 444 | 333 |
| 1111 | NULL |
| 1111 | NULL |
| 2222 | 1111 |
| 2222 | 1111 |
期望输出为每组记录分配原始ID(即每组中ADJ_ID为NULL的CLAIM_ID),输出表如下:
| ORG_ID | CLAIM_ID | ADJ_ID |
|---|---|---|
| 111 | 111 | NULL |
| 111 | 111 | NULL |
| 111 | 222 | 111 |
| 111 | 222 | 111 |
| 111 | 333 | 222 |
| 111 | 333 | 222 |
| 111 | 444 | 333 |
| 111 | 444 | 333 |
| 1111 | 1111 | NULL |
| 1111 | 1111 | NULL |
| 1111 | 2222 | 1111 |
| 1111 | 2222 | 1111 |
实现方案:使用递归CTE追溯根节点
针对这种层级关联的记录,可通过Snowflake的递归公共表表达式(CTE)实现,核心思路是追溯每条记录的根节点(ADJ_ID为NULL的记录),并将根节点ID作为该组所有记录的ORG_ID。
示例SQL代码
WITH RECURSIVE claim_hierarchy AS ( -- 锚点成员:提取所有根节点,ORG_ID为自身CLAIM_ID SELECT CLAIM_ID AS ORG_ID, CLAIM_ID, ADJ_ID FROM your_table_name WHERE ADJ_ID IS NULL UNION ALL -- 递归成员:关联子节点,继承根节点的ORG_ID SELECT ch.ORG_ID, t.CLAIM_ID, t.ADJ_ID FROM your_table_name t JOIN claim_hierarchy ch ON t.ADJ_ID = ch.CLAIM_ID ) SELECT ORG_ID, CLAIM_ID, ADJ_ID FROM claim_hierarchy ORDER BY ORG_ID, CLAIM_ID;
代码说明
- 锚点成员:筛选出所有ADJ_ID为NULL的记录,此时ORG_ID直接等于当前记录的CLAIM_ID,这就是每组的原始ID。
- 递归成员:将原表中ADJ_ID与递归CTE中的CLAIM_ID关联,把所有子节点记录加入结果集,并继承对应根节点的ORG_ID。
- 最终查询:从递归CTE中取出所有记录,按ORG_ID和CLAIM_ID排序后即可得到期望输出。
内容的提问来源于stack exchange,提问作者Magi
相关产品推荐
相关产品推荐

