Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/84.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在SQL中计算链的长度_Sql_Sas_Chain - Fatal编程技术网

在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

我在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
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。