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

时间:2018-12-05 19:27:42

标签: 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条记录和最后一条记录应具有相同的唯一标识符,因为人员A,B和H通过会话2链接,而人员B(与人员A链接)通过会话3链接到人员C。

即所有7条记录都通过人和/或会话链接。如果在结点结构中将人视为“父母”,并将会话视为“孩子”,则所有链接的孩子和父母都应使用相同的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

我已经尝试过移置和多次保留,但是逐行处理变得棘手,因为好像您必须保留部分匹配项,但是如果有完全匹配项,则返回分组。我可能会想得太多,但这似乎很复杂。

有人对我如何实现这一目标有任何想法吗?

1 个答案:

答案 0 :(得分:1)

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

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;