帮助计算分层数据集中的复数总和

2023-12-05

我有一个有趣的 SQL 问题。我有一个用于制作物料清单的零件分层表。与此类似:

ASSEMBLY
---------
parent_part_id
part_id
quantity

我通过如下查询获取此结构的层次结构:

SELECT level, part_id, quantity
from assembly
start with parent_part_id = 1
connect by parent_part_id = prior part_id;

输出可能如下所示:

level  part_id  quantity
-----  -------  ---------
1      2        2
2      3        10
1      4        2
2      5        1    
3      3        5

到目前为止,一切都很好。

问题是:如何计算制作顶级组件(第 1 部分)所需的每个零件的总数?

按部件对结果集进行分组并对数量求和是不正确的,因为该数量应乘以层次结构中当前部件紧上方的部件的数量,递归地沿树向上。

我认为这是一个 LAG 函数,但很难将其可视化。

编辑:预期结果:

part_id  quantity
-------  --------
2        2
3        30
4        2
5        2

更多编辑:我通过这个查询得到了有趣的结果

SELECT rownum, level lvl, part_id, quantity, unit_of_measure
                , connect_by_isleaf || sys_connect_by_path(quantity,'*') math
            from assembly
            start with parent_part_id = 1
            connect by parent_part_id = prior part_id

数学列返回我想要执行的计算的字符串表示形式:)例如它可能会说:

1*1*2*10

或类似且适当的东西...也许制作一个函数来解析它并返回结果将解决问题..有人认为这很离谱吗?


在 Oracle 11 R2 中,可以使用common table expression:

测试数据:

--  drop table assembly;

create table assembly (
  part_id              number, 
  parent_part_id       number,
  quantity             number
);

insert into assembly values (2, 1,  2);
insert into assembly values (3, 2, 10);
insert into assembly values (4, 1,  2);
insert into assembly values (5, 4,  1);
insert into assembly values (3, 5,  5);

选择语句:

select 
  part_id, 
  sum(quantity_used) as quantity
from (
  with assembly_hier (lvl, part_id, quantity, quantity_used) as (
    select 
      1        lvl,
      part_id,
      quantity ,
      quantity        quantity_used
    from
      assembly
    where
      parent_part_id = 1 
  union all
    select
      assembly_hier.lvl      + 1 lvl,
      assembly     .part_id,
      assembly     .quantity,
      assembly_hier.quantity_used * assembly.quantity quantity_used
    from
      assembly_hier, assembly
    where
      assembly_hier.part_id = assembly.parent_part_id
  )
  select * from assembly_hier
)
group by part_id
order by part_id;

Edit在 Ora11R2 之前,它可能适用于model clause:

select 
  part_id,
  sum(quantity) quantity 
from (
  select
    lvl
    parent_part_id,
    part_id,
    quantity
  from (
    select 
      lvl,
      parent_part_id,
      part_id,
      quantity
    from (
      select  
        rownum r, 
        level lvl, 
        parent_part_id,
        part_id, 
        quantity
      from 
        assembly
      start with parent_part_id = 1
      connect by parent_part_id = prior part_id
    )
  )
  model
    dimension by (lvl, part_id)
    measures (quantity, parent_part_id)
    rules upsert (
       quantity[     any, any          ] order by lvl, part_id =   quantity[cv(lvl)  , cv(part_id)] * 
                                          nvl( quantity[cv(lvl)-1,    parent_part_id[cv(lvl), cv(part_id)] ], 1)
    )
)
group by part_id
order by part_id;

Edit II另一种可能性是对数量的对数求和,然后取总和的指数:

select 
  part_id,
  sum(quantity) quantity
from (
  select 
    part_id,
    exp(sum(quantity_ln) over (partition by new_start order by r)) quantity
  from (
    select 
      r,
      lvl,
      part_id,
      quantity_ln,
      sum(new_start) over(order by r) new_start
    from (
      select 
        rownum r, 
        level lvl, 
        part_id, 
        ln(quantity) quantity_ln,
        nvl(lag(connect_by_isleaf,1) over (order by rownum),0) new_start
      from assembly
      start with parent_part_id = 1
      connect by parent_part_id = prior part_id
    )
  )
)
group by part_id
order by part_id
;
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

帮助计算分层数据集中的复数总和 的相关文章

随机推荐

  • 处理复制/粘贴或键入时 Eclipse 太滞后

    当我通过 Ctrl C Ctrl V 复制 粘贴或键入代码时 我的 Eclipse 相当延迟 3 4 秒来处理 有时 它会导致我的CPU负载达到100 我真的需要关于这个问题的建议 对于 OP 来说可能有点晚了 但我在使用 CTRL C C
  • 标准表达式中的数据类型不匹配

    我在 VB NET 中有一个项目 以 Ms Access 作为后端 将数据插入表时 查询和数据类型错误没有错误 但有时会发生 OleDB 异常 错误是 条件表达式中的数据类型不匹配 查询是 Dim cmdstr1 As String Dim
  • 在 R 中将向量中的每个元素复制不同时间[重复]

    这个问题在这里已经有答案了 假设我有一个数字向量v v lt 1 5 我想要rep v 1 by v 1 times v 2 by v 2 次 等等 期望的输出是 1 2 2 3 3 3 4 4 4 4 5 5 5 5 5 以下不起作用 有
  • LINQ 计数查询返回 1 而不是 0

    我有以下观点 CREATE VIEW tbl adjudicator result view AS SELECT a adjudicator id sar section adjudicator role id s section id s
  • 如何防止.NET 6中数字的小数部分自动四舍五入

    当我将版本从 NET Core 3 1转换为6 0后 我发现所有decimal 10 5 type 列会自动对数字的小数部分进行四舍五入 并以四舍五入的格式将其保存在数据库中 在 NET Core 的早期版本中它可以正常工作 例如 我有一个
  • 标记不同的图形、字体、大小 MATLAB

    I am trying to basically copy this graph for practice for my final coming up but I don t understand how to change the fo
  • 如何从对话框返回结果?

    我创建了一个对话框 一切都很好 除非我以某种方式返回结果 从对话框中获取用户选择的问题是我们不知道他 她何时会单击ok or cancel 我试图了解标准对话框是如何实现的 以便做类似的事情 我注意到所有打开对话框的功能 例如askdire
  • 按 dtype 选择 Pandas 列

    我想知道 Pandas DataFrames 中是否有一种优雅而快捷的方法来按数据类型 dtype 选择列 即从 DataFrame 中仅选择 int64 列 详细说明一下 类似于 df select columns dtype float
  • 更新 MathJax CDN

    正如官方宣布的那样 MathJax 将关闭其 CDN在 MathJax 网站上 and on StackExchange 的元数据 官方公告推荐了几种替代方案 包括使用替代 CDN 和自托管 对于有大量 MathJax CDN 引用的站点
  • 关于 Unix 命令“wc”,什么被视为一个单词?

    命令wc提供lineCount wordCount and charCount 我正在编写一个程序来模拟 wc 命令 因为它需要一个文件并吐出 3 个属性 行数很容易 因为如果它看到 n它会 lineCount如果一个字符存在并且它不是 E
  • 为在 Android 上实现 GCM 客户端创建 json 项目配置文件时出错

    我正在尝试让 gcm 在我的应用程序中工作 我的工作是将应用程序从 Eclipse 版本更新到 Android studio 版本 在 Android Studio 构建中 仅插入 gcm jar 不再有效 因此 我正在关注这个文档 htt
  • 在 ssrs 2008 中部署报告时如何停止询问凭据

    部署报告时 我收到登录提示 要求输入用户名和密码 我已尝试提供所有可能的 ID 和密码 但没有用 我可以访问报表管理器 url 和报表服务器 url 但如果我开始通过 SQL Server 商业智能开发工作室部署报表 我会收到上述提示 请让
  • 从 Python 调用时 SQL 存储过程未完成

    我试图从 python 脚本调用 MSSQL 数据库中的存储过程 但通过 python 调用时它无法完全运行 此过程将交易数据合并到单个表中的小时 每日块中 稍后由 python 脚本获取 如果我在 SQL studio 中运行该过程 它就
  • Docker 容器上的应用程序之间的 Curl 连接被拒绝

    我有一个网站 ZF1 和一个 API Laravel 在同一个 Docker Laradock 容器上运行 我可以通过浏览器单独访问每个内容 但是当我从网站向应用程序发出 cURL 请求时 我得到一个 null 响应 并且标头返回 0 如果
  • 如何解析服务器上 .html 文件中的 PHP 语法?

    这感觉像是一个非常n00b的问题 但这里是 我有一系列 HTML 文件 每个文件中都包含少量 HTML 内容 从实时系统导出 更改文件扩展名是不可行的 因为当我移交项目时 我不会是执行此 导出 刻录到 CD 过程的人 这是一个示例页面 它非
  • 使用 Selenium 进行边缘上传文件控制

    我正在尝试在 Edge 浏览器上使用 Selenium Webdriver 上传文件 是的 我已经下载了 EdgeDriver 并安装了用于测试 Edge 的 MSI 从 Edge 浏览器中单击屏幕上的元素效果很好 问题出在上传文件控制上
  • 如何更改 Google Analytics 中的数据

    我有一个大问题 找不到解决方案 在处理一个项目时 我发现一些用户凭据作为 URL 中的 GET 参数 一些外部程序员很马虎 这应该被删除 显然 但我无法找到更改 删除 旧数据的方法 如果有一个解决方案可以从包含 符号的字符串中删除所有 GE
  • jQuery:在 jqGrid 中是否可以重新排序工具栏按钮

    在 jqGrid 中 是否可以对页脚工具栏中的默认按钮重新排序 我试图让 搜索 按钮显示在 删除 按钮之前 我已阅读文档 但找不到任何提及 但认为可能有一个简单的技巧 没有标准选项允许对按钮中的按钮进行重新排序航海家工具栏 另一方面 jqG
  • 从 Windows 8.1 专业版升级到 Windows 10 后,我无法创建通用 10 项目

    Problem 我已经升级了我的windows 8 1 pro 64 bits to windows 10 64 bits开发通用应用程序windows 10 但我注意到 当我使用以下命令创建新的 universal 10 项目时 有很多错
  • 帮助计算分层数据集中的复数总和

    我有一个有趣的 SQL 问题 我有一个用于制作物料清单的零件分层表 与此类似 ASSEMBLY parent part id part id quantity 我通过如下查询获取此结构的层次结构 SELECT level part id q