Sql 使用两列中的值创建组ID-可传递

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

我有一个产品数据集,有两列表示分类。我想获得子图的基于组id的成员资格

组id必须是可传递的,如果class1对于观察值1和2相同,class2对于观察值2和3相等,那么1、2和3相等。在该示例中,您可以看到在第1-4行具有相同组id的结果中使用传递性

我在雪花城的一个sql仓库工作

输入:

| 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