【问题标题】:Count child rows into parent row in hierarchical column将子行计数到分层列中的父行中
【发布时间】:2017-04-26 09:58:27
【问题描述】:

我正在使用带有分层代码列表列、COUNT 列和分层指示符列的 oracle 表在 SAS 中工作,并且需要根据节点下子节点的计数更新父节点的 COUNT 列。

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

注意:

  • 不应该计算父节点,只计算最低的子节点(SO code=1 is count=3, code=2 is count=2)

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

  • 编码列表长度为 1 到 10 个字符。所以父母有 9 个等级。
  • 我更喜欢 PROC SQL 解决方法

我尝试创建一个临时 SAS 数据集并 UPDATE - SET = (SELECT COUNT) WHERE 在选择中使用 SUBSTR 函数,但不知道如何使其适用于每个层次结构级别。

【问题讨论】:

  • 提及所需的输出。
  • 你好。感谢回复。所需的输出是在“计数”列中具有更新值的同一个表。 (空)值更新为表中的实际计数。 ID=1 计数=3,ID=2 计数=1,ID=4 计数=2 以此类推。
  • 我看不出你怎么知道哪个节点是父节点,哪个节点是子节点。也许通过匹配 CODE 值的前缀? CODE 是数字还是字符变量?
  • 如果您更新空值,您将如何知道哪些是终端节点?
  • @Tom 没错。代码是一个字符变量。并且每个元素的父节点都是长度为(n-1)且所有字符匹配的元素。 code="1" 是 code="11" 和 code="12" 等的父代,而 code="12" 是 code="121" 和 code="122" 的父代。但这不是典型的层次结构,因为长度为 1 到 9 的父母不应该算作计数列中的孩子。真正的孩子只有 10 的长度。所以从数学上讲,一个级别的计数总和 = 其他级别的计数总和。不确定我是否解释清楚:/

标签: sas proc-sql


【解决方案1】:

只需进行自我加入。此示例使用长度 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;

【讨论】:

  • 很好的解决方案。谢谢!
  • 如果您要推送到外部数据库,您可能希望将布尔表达式转换为 CASE 语句以使其可移植。
  • 谢谢,但很遗憾我没有权限直接在数据库中创建,所以我将在 EG 中完成所有处理,然后对数据库表进行更新。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-21
相关资源
最近更新 更多