none
绝对的SQL 逻辑难题,做出来佩服你(不能用游标,只能用集合操作) RRS feed

  • 问题

  • 创建如下脚本:

    create table GTBALE(C1 Varchar(20),C2 Varchar(20),G Int )

     Insert Into GTBALE ValueS(001,'P1',Null)
     Insert Into GTBALE ValueS(001,'P2',Null)
     Insert Into GTBALE ValueS(002,'P2',Null)
     Insert Into GTBALE ValueS(002,'P3',Null)
     Insert Into GTBALE ValueS(003,'P4',Null)
     Insert Into GTBALE ValueS(004,'P5',Null)
     Insert Into GTBALE ValueS(005,'P1',Null)

    对如下的结果集进行分组,分组规则比较BT,有点递归分组的味道

    Select * From GTBALE

     

    行号:C1 C2    G
     1     1  P1   null
     2     1  P2   null
     3     2  P2   null
     4     2  P3   null
     5     3  P4   null
     6         P4   null
     7     3         null
     8     4  P5   null
     9     5  P1   null

    我需要的分组后的结果如下,G 为组号,

     行号 C1 C2    G
     1     1  P1      1
     2     1  P2      1
     3     2  P2      1
     4     2  P3      1
     5     3  P4      2
     6         P4      2
     7     3            2
     8     4  P5      3
     9     5  P1      1

    规则就是只要有相互交错到的C1 C2,都属于同一个组,也就是说,C1,C2中只要有一个值满足某个组里的已经存在的值,该行就属于那个组

     比如:C1列中两个列值1,1跟C2中的P1,P2对应,而C2中的两个列值P2,又跟C1中的列值1,2对应,所以第一,二,三行属于同一个组,而P3对应的C1值2又是组中的值,所以P3对应的行也属于组1,

    第5行中的3,P4 两个值在组1中都不存在,所以他是独立的,开始一个新的组2

    第6行中的P4 跟第5行中的P4一样,所以他们属于同一组2,

    第7行中的3 跟第5行中的3一样,所以他们属于同一组2,

    而第8行中的P5 ,在前面的组中都不存在,所以他也属于独立的组

    第9行中的P1,因为组1中已经存在那个值,所以也也属于组1了



    2011年12月9日 9:09

答案