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

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(使用前将#替换为@)

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

  • 私人聊天系统MYSQL查询显示发送者/接收者的最后一条消息

    在这里我延伸一下我之前的问题 私人聊天系统MYSQL查询ORDERBY和GROUPBY https stackoverflow com questions 10929366 private chat system mysql query o
  • 通过 SQLAlchemy 获取随机行

    如何使用 SQLAlchemy 从表中选择一个或多个随机行 这在很大程度上是一个特定于数据库的问题 我知道 PostgreSQL SQLite MySQL 和 Oracle 具有通过随机函数排序的能力 因此您可以在 SQLAlchemy 中
  • 我应该使用平面表还是标准化数据库?

    我目前正在开发一个使用 MySQL 数据库作为后端的 Web 应用程序 在继续下一步之前 我需要知道什么更适合我的情况 简而言之 在这个应用程序中 用户将能够使用任何数字字段 他们决定 构建自己的表单 现在我将其全部存储在通过外键链接的几个
  • Oracle:动态设置表中所有 NOT NULL 列以允许 NULL

    我有一个包含 75 多个列的表 几乎所有列都有 NOT NULL 约束 如果执行巨大的更改表修改语句 其中的每一列 我会收到一条错误消息 内容大致为 您不能将此字段设置为 NULL 因为它已经是 NULL 我必须对几个表执行此操作 因此更希
  • SQLite (Android):使用 ORDER BY 更新查询

    Android SQLite 我想要在 myTable 中的其他行之间插入行在android中使用SQLite 为此 我尝试增加从第 3 行开始的所有行的 id 这样 我就可以在位置 3 处插入新行 myTable 的主键是列 id 表中没
  • ASP SQL Server 连接

  • 如何在 R 中将字符串解析为层次结构或树

    有没有办法将表示组的字符串解析为 R 中的层次结构 假设我的小组结构如下 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 3 1 1 3 1 1 1 3 2 1 1 3 3 1 2 1 2 1 1 2 1 1 1 2 1 2 1
  • MySQL:如何获取每个分组的x个结果数[重复]

    这个问题在这里已经有答案了 可能的重复 mysql 在 GROUP BY 中使用 LIMIT 来获取每组 N 个结果 https stackoverflow com questions 2129693 mysql using limit w
  • 如何更新 pl/sql 中嵌套表的列? [复制]

    这个问题在这里已经有答案了 我正在尝试在表中创建一个可以存储多个值的列 如下所示 我有一个学生id std和一个名为marks可以采用几个值 例如2 3 4 我想更新此列表以添加另一个标记2 3 4 5但我不知道怎么做 我如何更新专栏mar
  • 没有为 1 个或多个必需参数给出值。更新SQL

    我正在编写一个程序 当用户在列表视图上选择记录时 该程序会更新密码或积分 我收到错误 没有为 1 个或多个必需参数给出值 我不知道如何纠正 我是否遗漏了一些明显的东西 Dim sql As String UPDATE Users SET P
  • 将数据从 oracle 移动到 HDFS,处理并从 HDFS 移动到 Teradata

    我的要求是 将数据从 Oracle 移至 HDFS 处理HDFS上的数据 将处理后的数据移至 Teradata 还需要每 15 分钟执行一次整个处理 源数据量可能接近50GB 处理后的数据也可能相同 在网上搜索了很多之后 我发现 PRARO
  • 一个表可以有多个主键吗?

    我现在很困惑 也许你可以帮助我更好地理解这个问题 即一个表可以有两个主键 如果是 那么如何 如果没有 那为什么 您询问是否可以有多个主键field你当然可以 您只能有一个主键 但它可以包含唯一标识行所需的任意数量的列 创建表时使用类似这样的
  • 需要 SQL 查询澄清[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我有一个由以下列组成的表 billid patientid doctorid fees 如何显示治疗多名患者的医生 尝试了以下代码并得到了
  • Oracle JDBC 预取:如何避免 RAM 不足/如何使 oracle 更快高延迟

    使用 Oracle java JDBC ojdbc14 10 2 x 加载包含多行的查询需要很长时间 高延迟环境 这显然是 Oracle JDBC 中的默认预取默认大小 10 每 10 行需要一次往返时间 我正在尝试设置一个激进的预取大小来
  • 插入具有多个值的外键

    我想知道 是否有可能创建一个表 其中我有一个接受外键但同一行可能有多个值的表 例如 Employee id name skillid Skill Skillid skillname 这里 Employee 的一个例子可以是 Employee
  • SQL Server:为什么 ISO-8601 格式的日期依赖于语言?

    我需要一些帮助来理解 SQL Server 中的日期格式处理 如果您尝试以下操作 它将返回正确的结果 SET LANGUAGE English SELECT CAST 2013 08 15 AS DATETIME 2013 08 15 00
  • PLSql 返回值

    我再次使用一些 PLSql 我想知道 是否有任何方法可以像选择一样使用以下函数 而不必将其转换为函数或过程 这样我就可以从包含它的脚本中看到代码 代码如下 DECLARE outpt VARCHAR2 1000 flow rI VARCHA
  • SQL - 需要查找重复记录但排除反向事务

    我有一张交易表 偶尔会有 重复条目 如果 当管理员发现这些重复条目时 他们将撤销交易 从而创建负值 但由于监管要求 原始重复条目仍然保留 我想创建一个 SQL 查询 并使用 Crystal Reports 来制作报告 以便管理员轻松查找重复
  • 时间序列数据的自连接

    我需要一些帮助来完成我认为应该是相当简单的自连接查询 只需要将两条记录中匹配的开始时间和结束时间合并为一条记录 假设我的表中有以下内容 Time Event 08 00 Start 09 00 Stop 10 30 Start 10 45
  • 将布尔参数传递给 SQL Server 存储过程

    我早些时候问过这个问题 我以为我找到了问题所在 但我没有 我在将布尔参数传递给存储过程时遇到问题 这是我的 C 代码 public bool upload false protected void showDate object sende

随机推荐

  • 处理复制/粘贴或键入时 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