问题标签 [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.
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
不能正常工作。
sql-server - sql server 使用recrusive cte获取同组中的级别
我有一个显示 ID 及其以前的 ID 的 sql server 表,
表格是这样的:
结果应该是这样的:
我已经使用递归 cte 成功获得了级别,但无法为他们获得正确的组。谁能帮忙?谢谢。
这是我的代码:
sql-server-2017 - 在 Product 和 Year 列表中,使用递归函数来包含前几年的产品
这是我面临的问题的简化。它归结为显示当前和前几年产品列表的 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 |
试图:
sql-server - 公用表表达式中的意外分析函数输出
在 SQL Server 2019 中,分析函数不会返回我在递归公用表表达式上下文中所期望的结果。考虑以下非递归 T-SQL 查询:
结果:
正如预期的那样MIN
,SUM
、 和ROW_NUMBER
函数会根据 中的所有行生成适当的值RecursiveCte0
。我希望以下递归查询在逻辑上与上面的非递归版本相同,但它会产生不同的结果:
结果:
对于三个分析函数中的每一个,似乎只在每个单独行的上下文中应用分组,而不是在该级别的所有行中应用。如果我对(SELECT NULL)
. 根据MSDN,我希望分析函数适用于整个递归级别:
CTE 递归部分中的分析和聚合函数应用于当前递归级别的集合,而不是应用于 CTE 的集合。像这样的函数
ROW_NUMBER
只对当前递归级别传递给它们的数据子集进行操作,而不是对传递给 CTE 递归部分的整个数据集进行操作。
为什么这两个查询会产生不同的结果?有没有办法通过递归公用表表达式有效地使用分析函数?
sqlite - 来自android的SQLite使用递归查询获取类似索引的路径
我有这个表命名为以下列和行的项目。
我可以通过递归 CTE 测量父行的级别,但我仍然需要以这种格式获取路径:1.1.1、1.2.1 ...这是我当前的查询:
期望的结果:
我怎样才能在 SQLite 中做到这一点?android运行的SQLite版本是3.21,所以不支持窗口函数。
c# - EF Core + Automapper ProjectTo 中的递归 CTE
在我的项目中,我有类型Comment
和CommentDto
:
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 格式来增加可读性):
注意:我做了大胆的评论,没有父母(根评论)。
映射Comment
成CommentDto
上面的代码适用于 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 翻译成以下内容:
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 个事件。
sql - 递归 CTE 以找到所有子级父级和深度的总计
我希望使用递归 CTE 来找到所有 childrencount 和 parentcount 以及 path 和 level 和 currentlevel 的 Total 像这样
我尝试了以下代码,但我不知道如何获取childrencount和parentcount以及path和level和currentlevel,如何编码它动态计算它。
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
先感谢您!
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 |