Sql 使用两列中的值创建组ID-可传递
我有一个产品数据集,有两列表示分类。我想获得子图的基于组id的成员资格 组id必须是可传递的,如果class1对于观察值1和2相同,class2对于观察值2和3相等,那么1、2和3相等。在该示例中,您可以看到在第1-4行具有相同组id的结果中使用传递性 我在雪花城的一个sql仓库工作 输入:Sql 使用两列中的值创建组ID-可传递,sql,snowflake-cloud-data-platform,Sql,Snowflake Cloud Data Platform,我有一个产品数据集,有两列表示分类。我想获得子图的基于组id的成员资格 组id必须是可传递的,如果class1对于观察值1和2相同,class2对于观察值2和3相等,那么1、2和3相等。在该示例中,您可以看到在第1-4行具有相同组id的结果中使用传递性 我在雪花城的一个sql仓库工作 输入: | class_1 | class_2 | ---------|------------------- | A | L1 | | A
| class_1 | class_2 |
---------|-------------------
| A | L1 |
| A | L1 |
| B | L1 |
| B | L2 |
| C | L3 |
| D | L4 |
+---------+-------------------+
输出:
| class_1 | class_2 |group_id|
---------|-------------------|-------|
| A | L1 | 1 |
| A | L1 | 1 |
| B | L1 | 1 |
| B | L2 | 1 |
| C | L3 | 2 |
| D | L4 | 3 |
+---------+-------------------+-------+
谢谢你的帮助
SELECT *
,sum(edge) over (order by id) + 1 as group_id
FROM (
SELECT *
,iff(class_1 = lag(class_1,1,class_1)over(order by id),0,1) as c1_t
,iff(class_2 = lag(class_2,1,class_2)over(order by id),0,1) as c2_t
,iff(c1_t+c2_t > 1,1,0) as edge
FROM (
VALUES(1,'A', 'L1')
,(2,'A', 'L1')
,(3,'B', 'L1')
,(4,'B', 'L2')
,(5,'C', 'L3')
,(6,'D', 'L4')
) AS v(id, class_1, class_2)
)
给出:
ID CLASS_1 CLASS_2 C1_T C2_T EDGE GROUP_ID
1 A L1 0 0 0 1
2 A L1 0 0 0 1
3 B L1 1 0 0 1
4 B L2 0 1 0 1
5 C L3 1 1 1 2
6 D L4 1 1 1 3