Grouping SAS:具有重叠值的多个列的唯一标识符

Grouping SAS:具有重叠值的多个列的唯一标识符,grouping,nodes,combinations,permutation,uniqueidentifier,Grouping,Nodes,Combinations,Permutation,Uniqueidentifier,以下面包含人员及其会话的示例代码为例: data test; length pers session $5; input pers $ session $; datalines; a 1 a 2 a 7 b 2 b 3 c 3 d 4 e 5 h 2 ; run; 前6条记录和最后一条记录应具有相同的唯一标识符,因为会话2将人员A、B和H链接起来,会话3将

以下面包含人员及其会话的示例代码为例:

data test;
    length pers session $5;
    input pers $ session $;
    datalines;
    a   1
    a   2
    a   7
    b   2
    b   3
    c   3
    d   4
    e   5
    h   2
    ;
run;
前6条记录和最后一条记录应具有相同的唯一标识符,因为会话2将人员A、B和H链接起来,会话3将人员B(链接到人员A)链接到人员C

i、 e.所有7个记录都通过个人和/或会话进行链接。如果在节点结构中将person视为“父级”,将session视为“子级”,则所有链接的子级和父级应位于同一UID中。任何中断都应该是单独的UID

第7行和第8行(人员D和E)将有自己的唯一标识符,因为它们没有重叠的人员或会话。结果如下所示:

Person|Session|Unique_ID
    a       1       UID1
    a       2       UID1
    a       7       UID1
    b       2       UID1
    b       3       UID1
    c       3       UID1
    h       2       UID1
    d       4       UID2
    e       5       UID3
我尝试过换位和多次保留,但逐行进行会变得很棘手,因为似乎你必须保留部分匹配,但如果有完整匹配,则返回分组。我可能想得太多了,但似乎很复杂


有人对我如何实现这一点有什么想法吗?

我再次修改了代码,它应该适用于上述场景

proc sql;
create table test1 as 
select x.*, flag from 
(select * from test) x
 left join 
 (select distinct a.cust, case when a.dev = b.dev
 and a.cust ne b.cust then 1  end as flag from test a
 inner join
 test b
 on a.dev = b.dev
 and a.cust ne b.cust) y
 on x.cust = y.cust;



proc sort data =test1;
 by cust ;
 run;

  data test2;
  set test1;
   by cust;
   retain _flag;

   if flag = 1 then _flag = flag;
   else if  first.cust then  _flag +1;
  Unique_ID = cats("UID",_flag);
drop flag _flag ;
 run;

数据集中有多少行?大多数情况下预计会发生什么?(客户+设备组合数量最多的合成组)如果您有SAS或,PROC BOM也是一个不错的选择。可能有数千行,可以将其视为可以访问相同设备(如计算机或智能手机)的家庭成员或个人分组(即,一个家庭中有3名客户使用总共4台设备)。永远不会有20个客户使用100台设备。不幸的是,我没有访问PROC BOM的权限--这看起来确实是一个不错的选择。这对原始示例有效,但在实际数据中无效,因此我可能应该添加更多变体。再次以上面的示例数据为例,其中现在有客户a和设备Ce 7.这正确分配UID1,但随后错误地为客户B和C重新分配UID。我已经修改了代码,现在设备可能在任何地方,如果设备在那里,则唯一id将不会增加。它已关闭,但仍然无法正常工作。如果您在客户H设备2的示例数据中添加一行(由于设备2,该行应链接到UID1),它最终得到了自己的UID3。我不确定你的意思。我的意思是,如果有任何匹配的设备可供任何客户使用。所有这些客户都被分组为1并获得UID1。否则,你要做的是为每个新客户添加+1,然后获得UID2、UID3等。