问题标签 [recursive-cte]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
95 浏览

postgresql - PostgreSQL 时间维度(按小时和天)错误

我正在使用 DATE_ID 和 DATE_DESC 在 PostgreSQL 中构建时间维度表。我的 T-SQL(完美运行)脚本是:

目前,我试图将此代码转换为 PostgreSQL 可读的代码,但它不起作用。这是我目前的:

我需要 2019-01-01 和 2019-12-31 之间的所有时间(24 小时)。目前我认为OPTION (MAXRECURSION 0)set EXTRACT(DOW FROM TIMESTAMP '2019-01-01 00:00:00.000')+1不能正常工作。

0 投票
1 回答
31 浏览

sql-server - sql server 使用recrusive cte获取同组中的级别

我有一个显示 ID 及其以前的 ID 的 sql server 表,

表格是这样的: 在此处输入图像描述

结果应该是这样的: 在此处输入图像描述

我已经使用递归 cte 成功获得了级别,但无法为他们获得正确的组。谁能帮忙?谢谢。

这是我的代码:

0 投票
1 回答
22 浏览

sql-server-2017 - 在 Product 和 Year 列表中,使用递归函数来包含前几年的产品

DB-小提琴

这是我面临的问题的简化。它归结为显示当前和前几年产品列表的 CTE。第一年(2018 年),它只会显示 2018 年的产品。第二年(2019)将展示2019+2018产品等。

我不知道 CTE 是否是最佳解决方案,但需要从某个地方开始。

预期结果:

产品
2018 产品2018A
2018 产品2018B
2019 产品2018A
2019 产品2018B
2019 产品2019
2020 产品2018A
2020 产品2018B
2020 产品2019
2020 产品2020A
2020 产品2020B

试图:

0 投票
0 回答
20 浏览

sql-server - 公用表表达式中的意外分析函数输出

在 SQL Server 2019 中,分析函数不会返回我在递归公用表表达式上下文中所期望的结果。考虑以下非递归 T-SQL 查询:

结果:

正如预期的那样MINSUM、 和ROW_NUMBER函数会根据 中的所有行生成适当的值RecursiveCte0。我希望以下递归查询在逻辑上与上面的非递归版本相同,但它会产生不同的结果:

结果:

对于三个分析函数中的每一个,似乎只在每个单独行的上下文中应用分组,而不是在该级别的所有行中应用。如果我对(SELECT NULL). 根据MSDN,我希望分析函数适用于整个递归级别:

CTE 递归部分中的分析和聚合函数应用于当前递归级别的集合,而不是应用于 CTE 的集合。像这样的函数ROW_NUMBER只对当前递归级别传递给它们的数据子集进行操作,而不是对传递给 CTE 递归部分的整个数据集进行操作。

为什么这两个查询会产生不同的结果?有没有办法通过递归公用表表达式有效地使用分析函数?

0 投票
2 回答
141 浏览

sqlite - 来自android的SQLite使用递归查询获取类似索引的路径

我有这个表命名为以下列和行的项目。

我可以通过递归 CTE 测量父行的级别,但我仍然需要以这种格式获取路径:1.1.1、1.2.1 ...这是我当前的查询:

期望的结果:

我怎样才能在 SQLite 中做到这一点?android运行的SQLite版本是3.21,所以不支持窗口函数。

0 投票
1 回答
92 浏览

c# - EF Core + Automapper ProjectTo 中的递归 CTE

在我的项目中,我有类型CommentCommentDto

Comment将映射到CommentDto. 这是配置

我有以下递归 CTE,封装在表值函数中:

此函数允许获取给定帖子的评论层次结构(它需要帖子的 ID)。

数据库中存储有评论:

为了使其更具可读性,我以分层顺序(仅Content属性)表示它:

  • 你好世界!
    • 你是程序员吗?
      • 当然
      • 什么?
  • 我也想去火星!
    • 月球上见:)

fn_PostCommentHierarchy使用 EF Core调用函数

EF Core 将以下 SQL 查询发送到 SQL-Server:
SELECT CommentId, Content, PostId, ParentCommentId FROM dbo.fn_PostCommentHierarchy('post-id-here')

上面的代码按预期工作(使用 JSON 格式来增加可读性):

注意:我做了大胆的评论,没有父母(根评论)。

映射CommentCommentDto

上面的代码适用于 entity-type Comment,但我想将其映射到CommentDto. 因此,让我们ProjectTo用于此目的:

注意_mapper是一个对象类型IMapper

我认为,结果应该与我使用之前得到的结果相似ProjectTo。但它看起来像:

注意:我做了大胆的评论,没有父母(根评论)。
比较使用前后的结果ProjectTo。为什么它们不同?

对于上面的代码,EF Core 将以下 SQL 查询发送到 SQL 服务器:

问题

为什么使用前的结果和使用ProjectTo后的结果ProjectTo不一样?如何解决这个问题?

更新 1

根据 Svyatoslav Danyliv 的说法:

递归 CTE 返回平面列表,然后您必须再次构建层次结构。

但是为什么在这种情况下我应该使用递归 CTE?
以下解决方案以相同的方式工作:

注意:我使用Dictionary了代替Lookup参见这个例子),但它并没有改变这个想法。

更新 2

让我们看一下更新 1 中的代码:

它将由 EF Core 翻译成以下内容:

0 投票
1 回答
67 浏览

mysql - MySQL递归cte基本案例

我有一堆聚合的事件表(订单就是其中之一),我可以像这样查询

这适用于简单的情况,但它更多地涉及重复创建的事件。业务需求之一是可以复制订单(从概念上讲,认为是move,不是copy)。这将关闭原始订单,然后员工可以继续处理新订单。为了显示订单的完整历史记录,不仅要显示当前订单的事件,还要显示任何原始订单的事件。

这是一个简化的示例:

订单 3

  • 5 月 10 日 - 发货
  • 5 月 9 日 - 包装
  • 5 月 9 日 - 与订单 2重复

订单 2

  • 5 月 9 日 - 关闭
  • 5 月 8 日 - 联系客户
  • 5 月 8 日 - 收到货
  • 5 月 6 日 - 从订单 1复制

订单 1

  • 5 月 6 日 - 关闭
  • 5 月 5 日 - 创建

我提出了一个相当简单的查询,适用于这种情况:

递归 CTE 最终从最新订单(基本案例部分)开始选择订单 ID,然后通过从事件主体中获取原始订单 ID 进行递归。order_id该示例的结果将是具有 3 行的单列: (3, 2, 1).

问题是,如果我们查看原始订单(在本例中为Order 1 ),根本不会显示任何事件,因为它没有重复的 created事件。因此,任何不重复的订单在基本情况下都不会选择任何内容,因此 CTE 将返回一个空结果集。

我觉得我的逻辑有些缺陷,我错过了 [明显] 简单的方法来获得我需要的东西。我认为在基本情况下,我可以改为搜索 ANY 事件名称和 GROUP BY id,因此order_id即使订单不是重复的,也可以获得基本情况下的查询(以类似的方式,我可以使用SELECT DISTINCT并放弃GROUP BY但这真的是一回事)。像这样:

这感觉像是一种解决方法,所以我很想修正我的逻辑。我错过了什么?


可重现的例子:

运行查询:order_id = 3应该返回所有 7 个事件。

运行查询:order_id = 2应该返回 5 个事件(应该忽略订单 3 的事件)。

运行查询:order_id = 1应该返回 2 个事件。

0 投票
1 回答
81 浏览

sql - 递归 CTE 以找到所有子级父级和深度的总计

我希望使用递归 CTE 来找到所有 childrencount 和 parentcount 以及 path 和 level 和 currentlevel 的 Total 像这样

我尝试了以下代码,但我不知道如何获取childrencount和parentcount以及path和level和currentlevel,如何编码它动态计算它。

0 投票
1 回答
52 浏览

mysql - MySQL中的递归CTE丢失日期

我有两张表 DT 和平均值:

我希望平均表具有与 DT 表中类似的日期,即我希望averages.workdate 列具有从最小日期到今天日期的员工(emp)的所有日期。然后,在递归 CTE 函数添加额外日期的地方,Score1 和 Score2 列可以有 0。我希望平均表看起来像这样:

工作日期 雇员 得分1 得分2
2021-06-01 萨尔 12 1
2021-06-02 萨尔 11 1
2021-06-03 萨尔 0 0
2021-06-04 萨尔 0 0
2021-05-28 瑞克 10 1
2021-05-29 瑞克 0 0
2021-05-30 瑞克 0 0
2021-05-31 瑞克 0 0
2021-06-01 瑞克 12 1
2021-06-02 瑞克 0 0
2021-06-03 瑞克 0 0
2021-06-04 瑞克 0 0

....等等。

我尝试加入两个表,但无法获得我想要的结果。可能有一种方法可以跳过创建 DT 表并使用平均表中的最少日期,然后在其上使用递归 CTE?我不确定它是否或如何工作,递归 CTE 函数的新功能。关于如何解决这个问题的任何想法?

相同的 db<>fiddle 在这里:https ://dbfiddle.uk/?rdbms=mysql_8.0&fiddle=0010c4d5e3a1c2eac9c065b31344f128

先感谢您!

0 投票
2 回答
44 浏览

sql - 如何使用递归 cte 或 SQL 中的其他方法累计计算不同的字段?

使用下面的示例,第 1 天将分别为 A、B、C 提供 1、3、3 个不同的名称。在第 2 天计算每个房屋的不同名称时,使用截至第 2 天的数据。在第 3 天计算每个房屋的不同名称时,使用截至第 3 天的数据。

可以使用递归cte吗?

数据:

房子 姓名
1 一种 杰克
1 流行音乐
1 C 安娜
1 C
1 C 佛朗哥
2 一种 乔恩
2 可能
2 C 安娜
3 一种 乔恩
3
3 C
3 C

结果:

房子 不同的名字
1 一种 1
1 1
1 C 3
2 一种 2(杰克和乔恩)
2 2
2 C 3
3 一种 2(杰克和乔恩)
3 3
3 C 3