对树数据进行分组、聚合和求和的最佳方法是什么?

2024-04-06

给定一个自引用表

Item 
-------------
Id (pk)
ParentId (fk)

具有关联值的相关表

ItemValue
-------------
ItemId (fk)
Amount

和一些样本数据

Item                       ItemValues 
Id      ParentId           ItemId      Amount
--------------------       ----------------------
1       null               1           10
2       1                  3           40
3       1                  3           20
4       2                  4           10
5       2                  5           30
6       null
7       6
8       7

我需要一个存储过程Item.Id并返回直接子项及其所有总和ItemValue.Amounts为了他们,他们的孩子,还有他们的孩子,一直到树下。

例如,如果1被传入,树将是2, 3, 4, 5直接孩子是2, 3输出将是

 ItemId    Amount
 ------------------
 2         40     (values from ItemIds 4 & 5)
 3         60     (values from ItemId 3)

应该采用什么样的方法来实现这种行为?

我正在考虑使用 CTE,但想知道是否有更好/更快的方法。


假设您的层次结构不是太深,这样的递归 CTE 就可以工作:

declare @ParentId int;
set @ParentId = 1;

;with 
  Recurse as (
    select 
      a.Id as DirectChildId
    , a.Id
    from Item a 
    where ParentId = @ParentId
    union all
    select
      b.DirectChildId
    , a.Id
    from Item a 
    join Recurse b on b.Id = a.ParentId
    )
select
  a.DirectChildId, sum(b.Amount) as Amount
from Recurse a
left join ItemValues b on a.Id = b.ItemId
group by
  DirectChildId;

非 CTE 方法需要某种形式的迭代,基于游标或其他形式。由于它是一个存储过程,因此有可能,并且如果有大量数据需要递归,那么只要您适当地对数据进行切片,它可能会更好地扩展。

如果聚集索引在Id上,则在ParentId上添加非聚集索引。作为覆盖索引,它将满足无需书签查找的初始查找。聚集索引将有助于递归连接。

如果 ParentId 上已有聚集索引,请在 Id 上添加非聚集索引。它们加起来实际上等同于上述内容。对于 ItemValues,如果实际表比此宽,您可能需要 (ItemId) INCLUDE (Amount) 上的索引。

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

对树数据进行分组、聚合和求和的最佳方法是什么? 的相关文章

  • 实体框架中的批量插入

    我使用批量插入插入大量记录 例如 20K 当我仅插入一个实体时 它会正常工作 但是 当我用来插入多个实体 例如一对多 时 它将仅插入父实体 而不会插入子实体 我的实体和代码 Customer cs public class Customer
  • SQL Server 批量插入 - “批量加载数据转换错误”

    bulk insert dbo A FROM d AData csv WITH FIELDTERMINATOR ROWTERMINATOR n 将批量数据插入数据库时 在检查可疑数据后 我遇到了无法解释的错误 消息 4867 16 级 状态
  • 删除重复的行并需要在mysql中保留所有行中的一个[重复]

    这个问题在这里已经有答案了 我想删除基于两列的重复行 但需要保留所有行 1 行 重复行可以多于两行 例如 ID NAME PHONE 1 NIL 1234 2 NIL 1234 3 NIL 1234 4 MES 5989 我想从上面 3 行
  • SQL 查询将文本数据存储在 Varbinary(max) 中

    有没有办法让 varbinary 在 SQL Server 中接受文本数据 这是我的情况 我有相当大量的 XML 我计划以 压缩 格式存储它们 这意味着 Varbinary 但是 当我进行调试时 我希望能够翻转配置开关并以纯文本形式存储 以
  • Oracle 按月滚动或运行总计

    目标 每个月末所有报表的滚动 运行总计 Code select TRUNC ACTHX STMT HX STMT DATE MM AS MNTH COUNT ACTHX INVOICE as STMTS from ACTHX group b
  • REGEXP_REPLACE - 仅当包含在 () 中时才从字符串中删除逗号

    我在 oracle 论坛网站找到了一个例子 输入字符串 a b c x y z a xx yy zz x WITH t AS SELECT a b c x y z a xx yy zz x col1 FROM dual SELECT t c
  • 在 SQL 中按键组对行进行顺序编号?

    SQL中有没有办法按顺序添加行号按关键组 假设一个表包含任意 CODE NAME 元组 示例表 CODE NAME A Apple A Angel A Arizona B Bravo C Charlie C Cat D Dog D Dopp
  • PostgreSQL 在递归查询中找到所有可能的组合(排列)

    输入是一个长度为 n 的数组 我需要生成数组元素的所有可能组合 包括输入数组中元素较少的所有组合 IN j A B C OUT k A AB AC ABC ACB B BA BC BAC BCA 随着重复 所以AB BA 我尝试过这样的事情
  • 私人聊天系统MYSQL查询显示发送者/接收者的最后一条消息

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

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

    我有这个表 我想添加几行的 change 列的值 或者更准确地说 从 ne 值为零的行到 ne 值为零的下一行 不是第二个本身 任何答案将不胜感激 rn date ne change 0 2008 12 07 0 10330848398 1
  • Spring Batch 死锁 - 无法增加身份;嵌套异常是 com.microsoft.sqlserver.jdbc.SQLServerException

    我们正在将 Spring Batch 应用程序从 Oracle DB 迁移到 Azure SQL Server 我在尝试执行时收到以下错误两个不同的工作同时更新不同的表 但使用相同的公共 BATCH 表 引起原因 org springfra
  • 如何进行数据透视并计算列平均值

    我承认这是迄今为止我必须面对的最复杂的 SQL 语句之一 我在这件事上碰壁了 我希望有人能帮我一把 我在数据库中有这张表 Item ActiveTime sec DateTime 1 10 2013 06 03 17 34 22 gt Mo
  • 如何在 Spring Data 中选择不同的结果

    我在使用简单的 Spring Data 查询或 Query 或 QueryDSL 在 Spring Data 中构建查询时遇到问题 如何选择三列 研究 国家 登录 不同的行 并且查询结果将是用户对象类型的列表 Table User Id S
  • Extbase - 从查询中获取创建的sql

    我想从我的typo3 扩展中获取一些数据库表 该扩展基于 extbase 查询总是不返回任何内容 但数据存在 我试过这个 query this gt createQuery query gt statement SELECT FROM my
  • 自动提取数据 - Oracle SQL Developer

    我通过 SQL Developer 连接到 Oracle 数据库 我想编写一个返回每月数据集的查询 然后将该数据提取到分隔文本文件中 我知道如何做到这一点就好了 我想知道是否有一种方法可以编写一个脚本来运行查询并在一年内逐月提取数据 这样我
  • SQLite (Android):使用 ORDER BY 更新查询

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

    例如我有一个这样的表 string adm A 2 A 1 B 2 A 1 C 1 A 2 通过 SQL 查询 我想要这样的结果 string perc adm A 50 B 100 C 0 我想要每个字符串中数字 2 出现的百分比 我可以
  • SQL Server - 将行连接到逗号分隔的列表中

    假设我有一个临时表 如下所示 Id Value 1 1 1 2 1 3 2 1 2 2 我希望我的桌子是这样的 Id ValueList 1 1 2 3 2 1 2 所以基本上我需要将我的值分组为逗号分隔的列表 我已经尝试过以下操作 SEL
  • hive sql查找最新记录

    该表是 create table test id string name string age string modified string 像这样的数据 id name age modifed 1 a 10 2011 11 11 11 1

随机推荐

  • 为什么我的 JavaScript 代码收到“请求的资源上不存在‘Access-Control-Allow-Origin’标头”错误,而 Postman 却没有?

    Mod note 这个问题是问为什么XMLHttpRequest fetch ETC 浏览器上的受相同访问策略限制 您会收到提及 CORB 或 CORS 的错误 而 Postman 则不受此限制 这个问题是not关于如何修复 No Acce
  • 通过 LinkedList 实现撤消/重做功能

    我正在编写自己的 魔方 应用程序 主要班级Cube有18种旋转方式 RotateAxisXClockWise RotateAxisXAntiClockWise 顺时针旋转轴 Y 逆时针旋转轴 Y RotateAxisZClockWise R
  • 单击按钮后更改键盘布局

    我正在开发一个 Android 应用程序 并且我有一个EditText和一个二RadioButtons A and B 我想做的是 When RadioButtonA 已选中 我想更改键盘布局以使用 完成 按钮显示它 当 的时候RadioB
  • 设置电子邮件正文 HTML 格式

    我将如何让正文以 HTML 格式工作 我需要添加什么以及我需要添加哪一行 我试过 MailMessage IsBodyHtml true 但这对我不起作用 这是这样做的方法吗 该代码应该替换另一行还是应该单独占一行 using System
  • 有没有简单的方法可以在 C# 中创建方法并动态设置其主体?

    我将方法体保存在字符串中 我想动态创建方法 但我不知道 如何设置它的身体 我看到使用 CodeDom 的方式非常乏味 我看到使用 Emit 和操作码 有什么方法可以使用字符串变量中的现成代码吗 string method body retu
  • 使用 $ 和字符值动态选择数据框列

    我有一个由不同列名组成的向量 我希望能够循环每个列名以从 data frame 中提取该列 例如 考虑数据集mtcars以及一些存储在字符向量中的变量名称cols 当我尝试从中选择一个变量时mtcars使用动态子集cols 这些工作都不是
  • 主窗口关闭时 QWidget 不会关闭

    我正在尝试创建一个主窗口 QWidget 当单击按钮时它会打开一个新的 QWidget 但是当我关闭主窗口时 最近打开的 QWidget 不会关闭 main cpp QApplication a argc argv MainWindow w
  • 有没有 recaptcha v2 关闭事件?

    我用这样的代码渲染 grecaptcha let callback const p new Promise resolve gt callback result gt resolve result grecaptcha render el
  • 使用 SQL Server CTE 扁平化层次结构系列

    寻找 SQL Server CTE 示例来创建层次结构 以便我可以输出所有系列 例如展平每个层次结构 例如 在家谱中 如果根从祖父母开始 我需要每个家庭成员的层次结构列表 其中包含成员详细信息 父母的行详细信息 喜欢 child1 row
  • 模型绑定下拉选择值

    我有一个模型 该模型有一个public List
  • 使用 Python 捕获 Mac OS X 系统音频输出

    我一直在尝试使用 劫持 Mac OS X 系统音频PyAudio http people csail mit edu hubert pyaudio 并在Python中保存为wav 也就是说 我不想从麦克风等输入设备进行录制 我想获取任何或所
  • 如何防止 Visual Studio 或 Docker 更改主机端口号?

    我已经对我的 Web 应用程序进行了 Docker 化 并且可以在 Visual Studio 中运行它 但是 它选择使用的主机端口号并不一致 在哪里将其配置为始终使用相同的端口号 我发现我可以通过编辑来做到这一点launchSetting
  • GC.Collect()

    好吧 我已经读过几个有关它的主题 但就这样吧 假设我有一个应用程序 基本上我会时不时地单击一个按钮 几分钟内会发生很多事情 然后它可能会再空闲一个小时 或者可能只是一分钟 在这一切结束之后 调用 GC Collect 不是一个很好的情况吗
  • Java EE、EJB 文件处理

    我正在开发一个网络应用程序 允许用户上传图片 然后系统将为他们生成拇指 我的问题依赖于这样一个事实 EJB 可以分布在多个服务器上 因此不允许直接处理文件 我可以将图像存储在数据库中 但我希望将它们作为文件存储在其中一台服务器中 我怎样才能
  • 将 Primefaces Jar 3.3 替换为 4.0 后,primefaces 计划事件颜色不起作用

    我使用 primefaces 4 0 并尝试更改 Primefaces Lazy Schedule 中事件的颜色 因此我有以下 xhtml 代码
  • JavaScript:扩展 Array.prototype 有什么危险?

    谷歌 JavaScript 风格指南建议不要延长Array prototype https google github io styleguide jsguide html disallowed features modifying bui
  • libgdal.so.20 问题 centos rgdal

    有人可以帮我理解 rgdal 的问题是什么吗 我为centos 6 64位安装了gdal 2 但没有成功安装rgdal 我试图找出问题所在 但在互联网上没有找到任何有用的信息 这是 Rstudio 服务器控制台 install packag
  • 获取异常实例类名

    我想知道这种情况下的异常实例是什么 try some risky actions catch Exception e System out println Get instance name there 我怎样才能实现这个目标 干得好 tr
  • Angular 10:无法编写参考

    我尝试按照 Angular 更新指南从 Angular 8 升级到 Angular 10 我的项目由核心应用程序 共享 2 个库 谷歌地图和共享组件 和一个额外的 apk fsm 2 个库 应用程序及其元数据 组成 核心和共享的构建正在通过
  • 对树数据进行分组、聚合和求和的最佳方法是什么?

    给定一个自引用表 Item Id pk ParentId fk 具有关联值的相关表 ItemValue ItemId fk Amount 和一些样本数据 Item ItemValues Id ParentId ItemId Amount 1