计算根的父母拥有的百分比

2024-01-03

简而言之,我试图计算树的父级所拥有的树根的百分比,即树的更上层。我怎样才能单独用 SQL 来做到这一点?

这是我的(示例)架构。请注意,虽然层次结构本身非常简单,但还有一个附加的holding_id,这意味着单亲父母可以“拥有”孩子的不同部分。

create table hierarchy_test ( 
       id number -- "root" ID
     , parent_id number -- Parent of ID
     , holding_id number -- The ID can be split into multiple parts
     , percent_owned number (3, 2)
     , primary key (id, parent_id, holding_id) 
        );

以及一些示例数据:

insert all 
 into hierarchy_test values (1, 2, 1, 1) 
 into hierarchy_test values (2, 3, 1, 0.25)
 into hierarchy_test values (2, 4, 1, 0.25)
 into hierarchy_test values (2, 5, 1, 0.1)
 into hierarchy_test values (2, 4, 2, 0.4)
 into hierarchy_test values (4, 5, 1, 1)
 into hierarchy_test values (5, 6, 1, 0.3)
 into hierarchy_test values (5, 7, 1, 0.2)
 into hierarchy_test values (5, 8, 1, 0.5)
select * from dual;

SQL小提琴 http://www.sqlfiddle.com/#!4/c3d5d/2

以下查询返回我想要进行的计算。据我所知,由于 SYS_CONNECT_BY_PATH 的性质,它本身无法执行计算。

 select a.*, level as lvl
      , '1' || sys_connect_by_path(percent_owned, ' * ') as calc
   from hierarchy_test a
  start with id = 1
connect by nocycle prior parent_id = id

数据中存在循环关系,但本例中没有。

目前我将使用一个非常简单的函数来将字符串转换为calc列变成数字

create or replace function some_sum ( P_Sum in varchar2 ) return number is
   l_result number;
begin  
   execute immediate 'select ' || P_Sum || ' from dual'
     into l_result;
     
   return l_result;   
end;
/

This seems to be a ridiculous way of going about it and I would rather avoid the additional time that will be taken parsing the dynamic SQL1.

从理论上讲,我认为,我应该能够使用 MODEL 子句来计算这个。我的问题是由树的非唯一性引起的。我使用 MODEL 子句来执行此操作的尝试之一是:

select *
  from ( select a.*, level as lvl
              , '1' || sys_connect_by_path(percent_owned, ' * ') as calc
           from hierarchy_test a
          start with id = 1
        connect by nocycle prior parent_id = id
                 )
 model
 dimension by (lvl ll, id ii)
 measures (percent_owned, parent_id )
 rules upsert all ( 
   percent_owned[any, any]
   order by ll, ii  = percent_owned[cv(ll), cv(ii)] * nvl( percent_owned[cv(ll) - 1, parent_id[cv(ll), cv(ii)]], 1)
               )

可以理解的是,这会失败并出现以下情况:

ORA-32638: 模型维度中的非唯一寻址

Using 独特的单一参考 http://docs.oracle.com/cd/E11882_01/server.112/e25554/sqlmodel.htm#DWHSG8797由于类似的原因而失败,即 ORDER BY 子句不唯一。

tl;dr

有没有一种简单的方法可以仅使用 SQL 来计算其父级所拥有的树的根的百分比?如果我的 MODEL 方向是正确的,那么我哪里出错了?

1. I'd also like to avoid the PL/SQL SQL context-switch. I realise that this is a tiny amount of time but this is going to be difficult enough to do quickly without adding an additional few minutes a day.


在 11g 中,可能是这样的——

SELECT a.*, LEVEL AS lvl
      ,XMLQuery( substr( sys_connect_by_path( percent_owned, '*' ), 2 ) RETURNING CONTENT).getnumberval() AS calc
   FROM hierarchy_test a
  START WITH id = 1
CONNECT BY nocycle PRIOR parent_id = id;

SQL小提琴 http://sqlfiddle.com/#!4/c3d5d/68.

或者,根据您的'1'|| trick-

SELECT a.*, LEVEL AS lvl
      , XMLQuery( ('1'|| sys_connect_by_path( percent_owned, '*' )) RETURNING CONTENT).getnumberval() AS calc
   FROM hierarchy_test a
  START WITH id = 1
CONNECT BY nocycle PRIOR parent_id = id;

不幸的是,在 10g 中,XMLQuery不能接受函数并且总是期望一个字符串文字进行评估,例如 -

select XMLQuery('1*0.25' RETURNING CONTENT).getnumberval() as val 
  from dual;

工作和回报0.25, but

select XMLQuery(substr('*1*0.25',2) RETURNING CONTENT).getnumberval() as val
   from dual;

gives ORA-19102: XQuery string literal expected.

随着树上层数的增加以及内部树创建的额外开销,查询可能会变慢XMLQuery本身。实现结果的最佳方法仍然是 PL/SQL 函数,顺便说一下,它在 10g 和 11g 中都可以工作。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

计算根的父母拥有的百分比 的相关文章

随机推荐

  • 使用 postMessage 跨域 iframe 调整大小

    我已经在这里阅读了所有跨域 iframe 帖子 感谢你们所有人 和其他地方 postMessage 脚本位于跨域 iframe 调整大小 https stackoverflow com questions 5606920 cross dom
  • setResourceValue NSURLTagNamesKey 错误

    尝试使用 setResourceValue 将标签颜色设置为蓝色时出现错误 var error NSError let listofTags NSWorkspace sharedWorkspace fileLabels let theURL
  • “application/octet-stream”而不是 application/csv?

    我对 Python 还很陌生 我想确认数据集的类型 下面代码中的URL 确实是一个csv文件 但是 当通过标题检查时 我得到 application octet stream 而不是 application csv 我假设我在读取数据时以错
  • ActionResult AcceptVerbsAttribute 默认 HTTP 方法有哪些?

    我知道您可以通过添加 AcceptVerbsAttribute 来限制特定 ActionResult 方法响应哪些 HTTP 方法 例如 AcceptVerbs HttpVerbs Get public ActionResult Index
  • 从 UIPageViewController 中删除视图控制器

    奇怪的是没有直接的方法来做到这一点 考虑以下场景 您有一个包含 1 页的页面视图控制器 添加另一个页面 共 2 个 并滚动到该页面 我想要的是 当用户滚动回到第一页时 第二页现在被删除并释放 并且用户无法再滑回该页面 我尝试在转换完成后将视
  • 如何计算 luxon 中两个日期之间的持续时间?

    Luxon s 的文档Duration fromISO method https moment github io luxon docs class src duration js 7EDuration html static method
  • HTML - 按钮 - 如何使其可链接?

    我有一个像这样的按钮
  • Ubuntu Github ssh 密钥问题

    我遵循了本指南中给出的每个步骤 http help github com linux key setup http help github com linux key setup 当我读到最后时 我可以 ssh 到 电子邮件受保护 cdn
  • Node JS:从树 json 制作平面 json

    我正在编写一个 node js 脚本来组合目录中的所有 json 文件并将结果存储为新的 json 文件 我尝试在很大程度上完成这项工作 但它有一些缺陷 A json id addEmoticon1 description Message
  • C64 组件 - 6502/6510 - 依次显示一系列三个位图,然后进入字符模式

    我这里有一个很大的问题 我发现仅靠几本参考书 互联网和你的真实资料很难回答这个问题 我只想显示一个位图 等几秒钟 把它从记忆中抹去 显示另一个位图 再等一下 把那个从记忆中抹掉 显示最终位图 等最后一次吧 而且 你已经猜到了 把它从记忆中抹
  • Chrome 切换到 OSX 通知后,网络推送通知未显示

    由于 Chrome 切换到本机 OSX 通知 有时我尝试使用网络推送和我的 Service Worker 显示的通知不会出现 它们在 Chrome 的早期版本中一致出现 自从他们开始做这项工作以来 我应该改变什么吗 确保 请勿打扰 已关闭
  • 快速字符串替换

    在构建了一个可能非常大的字符串后 我将对其进行大量更改 将其中的单个字符 或字节 如果需要 更改为另一个字符 实际上 我的脚本正在构建一个填字游戏 因此字符串不会很长 但我的问题很笼统 我如何利用我不改变字符串 或任何更好的数据类型 长度的
  • 如何增加 UIButton 的点击区域?

    I use UIButton具有自动布局 当图像较小时 点击区域也较小 我可以想象几种方法来解决这个问题 增加图像尺寸 即在图像周围放置透明区域 这不好 因为当您定位图像时 您必须记住额外的透明边框 使用 CGRectInset 并增加大小
  • 在 Solaris 上构建 Node.JS:“使用 仅在 c99 编译环境中有效。”

    我正在尝试在 Solaris 上安装 Node JS 这是开箱即用的 Solaris 9 10 x86 最新版本是 2010 年 9 月 并且仅使用默认软件包 我遵循的方向在这里 https github com joyent node w
  • 在Android 4.0.3中设置textview淡入淡出

    我刚刚尝试实现淡入淡出效果TextView在安卓4 0 3中 然而 它不起作用 fadingEdge horizontal singleLine true ellipsize marquee 此代码适用于 2 3 7 及以下版本 但不适用于
  • Dart 作为 Worker 进行隔离

    编辑以使问题更清楚 我正在尝试在 Dart 中使用 Isolates 或 Web Workers 我能找到在主线程和隔离线程之间进行通信的唯一方法是send and 打电话然后从主线程 但这是主线程将一些数据传递给隔离的好方法 如果我希望分
  • GitHub 推送错误 - “git 媒体更新”

    我一直在使用 GitHub for Mac 客户端 两个月来它一直工作得很好 昨天 成功提交和推送后 我的客户端自行关闭然后重新启动 从那时起 我就无法将更改推送到我的在线存储库 在客户端中 我收到消息 git media pre push
  • 在Sikuli拍照的命令是什么

    我正在使用 Sikuli IDE 我想知道截屏的命令是什么 这样我就可以在测试结束时捕获屏幕 像这样的东西 try if bla bla bla print blablabla else TAKESCREENSHOT gt What com
  • 在 stripes actionbean 中绑定隐藏字段时,隐藏字段变为 null

    我有一个条纹操作页面 当页面加载时 我想通过从对象 即 setOriginalAssignee userAction getAssignee 分配原始Assignee 来保存它 这样 如果对象的字段受让人发生更改 我将进行一些计算 这是我的
  • 计算根的父母拥有的百分比

    简而言之 我试图计算树的父级所拥有的树根的百分比 即树的更上层 我怎样才能单独用 SQL 来做到这一点 这是我的 示例 架构 请注意 虽然层次结构本身非常简单 但还有一个附加的holding id 这意味着单亲父母可以 拥有 孩子的不同部分