Sas 将子行计数到分层列中的父行中
我在SAS中使用一个oracle表,该表具有一个分层代码列表列、一个计数列和一个分层指示符列,需要根据节点下的子节点计数更新父节点的计数列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
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表进行更新。