在SQL中计算链的长度
我在SAS/SQL中有一个表,如下所示: 输入在SQL中计算链的长度,sql,sas,chain,Sql,Sas,Chain,我在SAS/SQL中有一个表,如下所示: 输入 Field1 Field2 A B E F C D B C Field1 Field2 Length A B 1 B C 2 C D 3 E F 1 我想有第三列,告诉我可以用Field1和Field2生成的“链”的长度。我会举例说明。在我们的情况下,我希望: 输出 Field1 Field2 A B
Field1 Field2
A B
E F
C D
B C
Field1 Field2 Length
A B 1
B C 2
C D 3
E F 1
我想有第三列,告诉我可以用Field1和Field2生成的“链”的长度。我会举例说明。在我们的情况下,我希望:
输出
Field1 Field2
A B
E F
C D
B C
Field1 Field2 Length
A B 1
B C 2
C D 3
E F 1
这将要做的是找到“链”并计算其长度。在本例中,我们有两条链:“A-B-C-D”和“E-F”。链首先以链的开头形成一行,在这种情况下为“a-B”。然后,由于字段2中的值是B,它将查找字段1中的值B,并将其与字段2的新对应值一起写入第一行,在本例中为“B-C”。然后它将检查字段1中是否存在值C,如果是这样,则将其写下来。在我们的例子中,它将是“C-D”。同样,它将检查字段1中是否存在值D。因为它不存在,它将以下面的链开始算法,并将写“E-F”,它没有更多的连接
长度值将给出该对的“深度”。“A-B”是第一对,“B-C”是链“A-B-C”的第二对,“C-D”是链“A-B-C-D”的第三对
我没办法解决这个问题,有什么帮助吗?。它不需要完全以这种形式出现,任何变通方法都会有很大帮助
如果重要的话,对于给定的行,Field1=Field2从来都不是这样
谢谢 在SAS中的SQL实现中不可能 在数据步骤中有很多方法可以做到这一点。如果您理解散列,那么散列对象可能是最简单的。使用散列迭代器从散列中获取第一行,然后获取与字段2匹配的任何行;如果没有与字段2匹配的行,停止查找,让迭代器取出下一行
data have;
input Field1 $ Field2 $;
datalines;
A B
E F
C D
B C
;;;;
run;
data want;
if 0 then set have;
declare hash h(dataset:'have', ordered:'a');
h.defineKey('field1');
h.defineData('field1','field2');
h.defineDone();
declare hiter hi('h');
do rc = hi.next() by 0 while (rc=0); *outside iterator - grab the next available row;
seq = 1; *initialize the sequence variable;
output; *output the first row;
do rc_h = h.find(key:field2) by 0 while (rc_h=0); *inside seek - looks for a row (anywhere) that matches field2.;
seq=seq+1; *increment the sequence variable;
output; *output this row;
rc_r = h.remove(); *remove that row from the hash as it has been "used";
rc_h = h.find(key:field2); *look to see if there is another match in this sequence;
end;
rc = hi.next();
end;
stop;
drop rc:;
run;
您将需要递归CTE。SAS还没有这些,IIRC。