Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.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
Sas 将子行计数到分层列中的父行中_Sas_Proc Sql - Fatal编程技术网

Sas 将子行计数到分层列中的父行中

Sas 将子行计数到分层列中的父行中,sas,proc-sql,Sas,Proc Sql,我在SAS中使用一个oracle表,该表具有一个分层代码列表列、一个计数列和一个分层指示符列,需要根据节点下的子节点计数更新父节点的计数列 ID level code count 1 1 1 (null) 2 2 15 (null) 3 3 156 1 4 2 18 (null) 5 3 181 1 6 3 182 1 7 1 2 (nu

我在SAS中使用一个oracle表,该表具有一个分层代码列表列、一个计数列和一个分层指示符列,需要根据节点下的子节点计数更新父节点的计数列

ID   level  code  count
1    1      1     (null)
2    2      15    (null)
3    3      156   1
4    2      18    (null)
5    3      181   1
6    3      182   1
7    1      2     (null)
8    2      20    (null)
9    3      205   1
10   3      206   1
注:

  • 不应对父节点计数,只对最低的子节点计数(因此code=1表示计数=3,code=2表示计数=2)

  • “最低”子节点的预设计数为1,我需要更新空值

  • 代码列表的长度为1到10个字符。因此,父母有9个等级
  • 我更喜欢PROC-SQL解决方案

我试图创建一个临时SAS数据集,并在其中使用SELECT中的SUBSTR函数更新-SET=(SELECT COUNT),但无法确定如何使其适用于每个层次结构级别。

只需执行自联接即可。本例使用长度3作为终端节点,但如果实际数据使用10,则只需将3更改为10即可

proc sql ;
 create table want as 
 select a.id,a.level,a.code
      , (a.level=3) as Terminal_Node
      , sum(b.level=3) as Count_Terminal_Nodes
 from have a full join have b
 on a.code = substr(b.code,1,a.level)
 group by a.id,a.level,a.code
 order by 1
;
quit;

提及所需的输出。您好。谢谢你的回复。所需输出与“计数”列中的更新值相同。更新为表中实际计数的(空)值。ID=1 count=3,ID=2 count=1,ID=4 count=2等等。我不明白您如何知道哪个节点是父节点,哪个节点是子节点。也许通过匹配代码值的前缀?代码是一个数字还是一个字符变量?如果你更新空值,你将如何知道哪些是终端节点?@Tom。代码是一个字符变量。每个元素父节点是长度为(n-1)且所有字符匹配的元素。code=“1”是code=“11”和code=“12”等的父级,而code=“12”是code=“121”和code=“122”的父级。但这不是一个典型的层次结构,因为长度为1到9的父项不应在count列中计为child。真正的孩子只有10岁。因此,一个级别的计数之和=其他级别的计数之和。但我不确定我是否解释得很清楚:这是一个很好的解决方案。非常感谢。如果您要进入外部数据库,您可能希望将布尔表达式转换为CASE语句以使其可移植。谢谢,但不幸的是,我没有直接在DB中创建的权限,因此我将只在EG中执行所有处理,然后对DB表进行更新。