采用以下包含人员及其会话的示例代码:
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
我已经尝试过移置和多次保留,但是逐行处理变得棘手,因为好像您必须保留部分匹配项,但是如果有完全匹配项,则返回分组。我可能会想得太多,但这似乎很复杂。
有人对我如何实现这一目标有任何想法吗?
答案 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;