news 2026/5/5 20:21:39

DeepSeek总结的DuckDB使用 WITH RECURSIVE 和 USING KEY 进行聚合的特性

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
DeepSeek总结的DuckDB使用 WITH RECURSIVE 和 USING KEY 进行聚合的特性

原文地址:https://github.com/duckdb/duckdb/commit/6b441dd39844b1b303c403623452e2810ef0e195

特性: 在USING KEY中使用聚合 (#19481)

大家好,

TLDR(摘要):
此 PR 为USING KEY特性引入了新功能。简而言之,我们泛化了USING KEY的原则,通过让用户更精确地控制非键列的处理方式。他们可以选择性地为有效载荷(即非键)列定义自己的聚合函数。这使得用户能够保留在迭代中产生的、并非最后一个值的其他值。例如,他们可以保存列中的最小值(min),或者依赖于该行中其他列的值(arg_min)。

得益于这种新的泛化,USING KEY可以用于进一步简化算法,例如最短路径算法,这已被他人提及。

# 实现方式和语法是如何工作的?

USING KEY的实现使用了一个聚合哈希表。该表包含键列和有效载荷列,哈希表将在有效载荷列上执行聚合函数。

在此之前,我们使用last聚合函数来实现USING KEY特有的upsert行为:如果某次迭代产生的键已存在于字典中,则最近一次迭代会替换该键对应的有效载荷。通过此 PR,用户可以使用替代的聚合函数(例如minmaxavg等),从而覆盖默认的last

以下查询仅为解释USING KEY执行行为而进行了简化。

现在,我们可以在USING KEY子句中为特定的有效载荷列指定额外的聚合函数。我们可以通过列引用(例如max(<column_ref>))在聚合中引用输出列。

WITHRECURSIVE tbl(a,b)USINGKEY(a,max(b))AS(SELECT1,5UNIONSELECTa,b-1FROMtblWHEREb>0)TABLEtbl;┌───────┬───────┐ │ a │ b │ │ int32 │ int32 │ ├───────┼───────┤ │15│ └───────┴───────┘

如查询结果所示,此查询实际上会终止,而不是在每次迭代中产生行(1, 5):列b中的max聚合值被维护(并且在查询使用recurring.tbl时可被获取),而工作表(将包含行(1, 5),然后是(1, 4),最后是(1, 0))的行为继续遵循常规递归 CTE 的语义。

值得注意的是,在循环表中,我们可以访问截至目前计算出的聚合值:我们可以检查到递归中此点为止的聚合结果。(这实际上允许我们将循环表用作滑动窗口,来计算累加和等。)

WITHRECURSIVE tbl(a,b,c)USINGKEY(a,avg(b),list(c))AS(SELECT1,5,NULL::DOUBLEUNIONSELECTa.a,a.b-1,b.bFROMtblASa,recurring.tblASbWHEREa.b>0)TABLEtbl;┌───────┬────────┬─────────────────────────────────┐ │ a │ b │ c │ │ int32 │doubledouble[]│ ├───────┼────────┼─────────────────────────────────┤ │12.5[NULL,5.0,4.5,4.0,3.5,3.0]│ └───────┴────────┴─────────────────────────────────┘

然而,也可以在聚合中使用任意表达式,而不仅仅是纯列引用。唯一的限制是,任何包含的列引用必须是递归 CTE 模式的一部分。

在这种情况下,我们还需要指定将保存聚合结果的输出列的名称。我们可以通过使用命名参数语法b := max(a+b)max(a+b) AS b来实现。这两种变体都可以。

WITHRECURSIVE tbl(a,b)USINGKEY(a,max(b*3)ASb)AS(SELECT1,5UNIONSELECTa,b-1FROMtblWHEREb>0)TABLEtbl;┌───────┬───────┐ │ a │ b │ │ int32 │ int32 │ ├───────┼───────┤ │115│ └───────┴───────┘

# 新的方法

另一个积极的副作用是,当使用非增量聚合函数(如median)时,我们可以节省内存。对于这些聚合函数,我们需要来自所有迭代的所有计算值。对于普通的递归 CTE 和当前USING KEY的实现,有两种方式可以使用非增量聚合函数。

旧方式:像以前使用普通递归 CTE 一样,我们在联合表中收集所有必要的行,然后在 CTE 计算完成后使用带有GROUP BY的聚合函数。

WITHRECURSIVE tbl(a,b,payload)AS(SELECT1,1,aFROM(SELECTlist(a)FROMgenerate_series(1,5000)AS_(a))_(a)UNIONSELECTa,b+1,payloadFROMtblWHEREb<200000)SELECTmedian(b)FROMtblGROUPBYa;

这种方法的缺点是它复制了整个有效载荷。如果有效载荷的某些部分与聚合函数完全无关,我们就在不必要地增加内存占用。

USING KEY方式:旧的USING KEY语义只记住最近产生的行,因此我们必须添加一个新列来存储聚合所需的所有值。

WITHRECURSIVE tbl(a,b,acc,payload)USINGKEY(a)AS(SELECT1,1,[1],aFROM(SELECTlist(a)FROMgenerate_series(1,5000)AS_(a))_(a)UNIONSELECTa,b+1,acc||[b+1],payloadFROMtblWHEREb<200000)SELECTa,list_median(b)FROMtbl;

我们没有重复的有效载荷,但仍然需要添加一个额外的列来计算非增量聚合,以及一个额外的数组和对其的操作来模拟“记忆”部分。

使用USING KEY进行聚合的方式:通过我在此处实现的新特性,我们既可以获得去重有效载荷的优势,也无需添加和管理新列。

WITHRECURSIVE tbl(a,b,payload)USINGKEY(a,median(b))AS(SELECT1,1,aFROM(SELECTlist(a)FROMgenerate_series(1,5000)AS_(a))_(a)UNIONSELECTa,b+1,payloadFROMtblWHEREb<200000)SELECTa,bFROMtbl

在这里,我们将聚合函数添加到USING KEY子句中。聚合函数本身会处理值的存储方式,确保有效载荷不被重复。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/1 9:10:46

2026冲刺用!8个AI论文工具测评:研究生毕业论文+开题报告写作全攻略

随着人工智能技术的不断进步&#xff0c;AI写作工具在学术领域的应用日益广泛。对于研究生群体而言&#xff0c;从开题报告到毕业论文的撰写&#xff0c;往往面临时间紧张、内容逻辑不清、格式规范复杂等多重挑战。2026年&#xff0c;随着更多高效、智能的AI工具涌现&#xff0…

作者头像 李华
网站建设 2026/5/2 7:52:14

‌模糊测试增强:遗传算法驱动的API边界用例生成工具‌

边界测试的痛点与遗传算法的革新 API测试中&#xff0c;边界值输入校验的缺失常导致接口崩溃或安全漏洞&#xff0c;传统手动编写用例效率低下&#xff08;耗时占比超40%&#xff09;。遗传算法&#xff08;Genetic Algorithm, GA&#xff09;结合模糊测试&#xff08;Fuzzing…

作者头像 李华
网站建设 2026/5/1 13:29:24

百考通一句话需求,一键生成专业问卷,让调研智能高效

百考通&#xff08;https://www.baikaotong.ai.com&#xff09;深刻理解这一痛点&#xff0c;凭借前沿的AI技术&#xff0c;隆重推出“智能问卷设计”功能&#xff0c;旨在将繁琐的问卷制作过程简化为一句描述&#xff0c;让专业调研触手可及。 一、告别繁琐&#xff1a;一句话…

作者头像 李华
网站建设 2026/5/1 13:33:13

HoRain云--CentOS7路由追踪安装与使用全攻略

&#x1f3ac; HoRain 云小助手&#xff1a;个人主页 ⛺️生活的理想&#xff0c;就是为了理想的生活! ⛳️ 推荐 前些天发现了一个超棒的服务器购买网站&#xff0c;性价比超高&#xff0c;大内存超划算&#xff01;忍不住分享一下给大家。点击跳转到网站。 目录 ⛳️ 推荐 …

作者头像 李华
网站建设 2026/5/2 5:09:35

uni-app—— uni-app 小程序页面返回后数据刷新的 5 种方案对比

问题现象 在一个审批小程序中&#xff0c;用户操作流程如下&#xff1a; 进入审批列表&#xff0c;看到一条"草稿"状态的申请点击进入详情页点击"继续编辑"进入编辑页编辑完成后点击"重新提交申请"返回列表页 问题&#xff1a;返回列表后&…

作者头像 李华
网站建设 2026/5/3 5:47:43

用过才敢说! 降AIGC网站 千笔·专业降AIGC智能体 VS 学术猹,MBA专属更高效

在AI技术迅速发展的背景下&#xff0c;越来越多的学生和研究人员开始借助AI工具提升论文写作效率。然而&#xff0c;随着学术审查标准的不断升级&#xff0c;AI生成内容的痕迹和重复率问题日益凸显&#xff0c;成为影响论文通过率的关键障碍。许多学生在使用各类降AI率和降重复…

作者头像 李华