前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >三行五行的 SQL 只存在于教科书和培训班

三行五行的 SQL 只存在于教科书和培训班

原创
作者头像
朱迪
发布于 2024-02-29 08:43:47
发布于 2024-02-29 08:43:47
27800
代码可运行
举报
文章被收录于专栏:数据计算数据计算
运行总次数:0
代码可运行

教科书中 SQL 例句通常都很简单易懂,甚至可以当英语来读,这就给人造成 SQL 简单易学的印象。 但实际上,这种三行五行的 SQL 只存在于教科书和培训班,我们在现实业务中写的 SQL 不会论行,而是以 K 计的,一条 SQL 几百行 N 层嵌套,写出 3K5K 是常事,这种 SQL,完全谈不上简单易学,对专业程序员都是恶梦。 以 K 计本身倒不是大问题,需求真地复杂时,也只能写得长,Python/Java 代码可能会更长。但 SQL 的长和其它语言的长不一样,SQL 的长常常会意味着难写难懂,而且这个难写难懂和任务复杂度不成比例。除了一些最简单情况外,稍复杂些的任务,SQL 的难度就会陡增,对程序员的智商要求很高,所以经常用作应聘考题。

这是为什么呢? 其中一个原因是我们之前讲过的,SQL 像英语而缺乏过程性,要把很多动作搅合在一句中,凭空地增大思维难度。 但是我们会发现,即使 SQL 增加了步骤化的 CTE 语法,面对稍复杂的任务时,仍然会写的非常难懂。 这是因为,SQL 的描述能力还有不少重要的缺失,这导致程序员不能按自然思维写代码,要换着方法绕。 我们通过一个简单的例子来看一下。

简化的销售业绩表 T 有三个字段:sales 销售员,product 产品,amount 销售额。我们想知道空调和电视销售额都在前 10 名的销售员名单。 这个问题并不难,可以很自然地设计出计算过程: 1.按空调销售额排序,找出前 10 名; 2.按电视销售额排序,找出前 10 名; 3.对 1、2 的结果取交集,得到我们想要的

用 CTE 语法后 SQL 可以写成这样:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
with A as (select top 10 sales from T where product='AC' order by amount desc),
     B as (select top 10 sales from T where product='TV' order by amount desc)
select * from A intersect B
with A as (select top 10 sales from T where product='AC' order by amount desc),
     B as (select top 10 sales from T where product='TV' order by amount desc)
select * from A intersect B

这个句子不太短,但思路还是清晰的。

现在,我们把问题复杂化一点,改为计算所有产品销售额都在前 10 名的销售员,延用上述的思路很容易想到: 1. 列出所有产品; 2. 算出每种产品销售额的前 10 名,分别保存; 3. 针对这些前 10 名取交集; 遗憾开始出现,CTE 语法只能写出确定个数的中间结果。而我们事先不知道总共有多个产品,也就是说 WITH 子句的个数是不确定的,这就写不出来了。 好吧,换一种思路: 1.将数据按产品分组,将每组排序,计算出每组前 10 名; 2.针对这些前 10 名取交集; 这需要把第一步的分组结果保存起来,而这个中间结果是一个表,其中有个字段要存储对应的分组成员的前 10 名,也就是字段的取值将是个集合,SQL 不支持这种数据类型,还是写不出来。

我们可以再转换思路。按产品分组后,计算每个销售员在所有分组的前 10 名中出现的次数,若与产品总数相同,则表示该销售员在所有产品销售额中均在前 10 名内。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
select sales from ( 
    select sales from (
        select sales, rank() over (partition by product order by amount desc ) ranking
        from T ) where ranking <=10 )
group by sales having count(*)=(select count(distinct product) from T)
select sales from ( 
    select sales from (
        select sales, rank() over (partition by product order by amount desc ) ranking
        from T ) where ranking <=10 )
group by sales having count(*)=(select count(distinct product) from T)

在窗口函数支持下,终于能写出来了。但是,这样的思路,绕不绕呢,有多少人想到并写出来呢? 前两种简单的思路无法用 SQL 实现,只能采用第三种迂回的思路。这里的原因在于 SQL 的一个重要缺失:集合化不彻底。 SQL 有集合概念,但并未把集合作为一种基础数据类型提供,不允许字段取值是集合,除了表之外也没有其它集合形式的数据类型,这使得大量集合运算在思维和书写时都非常绕。

我们刚才用了关键字 top,事实上关系代数理论中没有这个东西,这不是 SQL 的标准写法。 没有 top 如何找前 10 名呢? 大体思路是这样:找出比自己大的成员个数作为是名次,然后取出名次不超过 10 的成员

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
select sales from (
    select A.sales sales, A.product product,
        (select count(*)+1 from T
         where A.product=product and A.amount<=amount) ranking
    from T A )where product='AC' and ranking<=10
select sales from (
    select A.sales sales, A.product product,
        (select count(*)+1 from T
         where A.product=product and A.amount<=amount) ranking
    from T A )where product='AC' and ranking<=10

注意,这里的子查询没办法用 CTE 语法分步写,因为它用到了主查询中的信息作为参数。

或可以用连接来写,这样子查询倒是可以用 CTE 语法分步了:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
select sales from (
    select A.sales sales, A.product product, count(*)+1 ranking from T A, T B
    where A.sales=B.sales and A.product=B.product and A.amount<=B.amount
    group by A.sales,A.product )
where product='AC' and ranking<=10
select sales from (
    select A.sales sales, A.product product, count(*)+1 ranking from T A, T B
    where A.sales=B.sales and A.product=B.product and A.amount<=B.amount
    group by A.sales,A.product )
where product='AC' and ranking<=10

无论如何,这种东西都太绕了,专业程序员也要想一阵子,仅仅是计算了一个前 10 名。

造成这个现象的原因就是 SQL 的另一个缺失:缺乏有序支持。SQL 继承了数学上的无序集合,与次序有关的计算相当困难,而可想而知,与次序有关的计算会有多么普遍(诸如比上月、比去年同期、前 20%、排名等)。 SQL2003 标准中增加的窗口函数提供了一些与次序有关的计算能力,这在一定程度上缓解 SQL 有序计算的困难,前 10 名可以这样写:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
select sales from ( 
    select sales, rank() over (partition by product order by amount desc ) ranking
    from T )
where ranking <=10
select sales from ( 
    select sales, rank() over (partition by product order by amount desc ) ranking
    from T )
where ranking <=10

还是要用子查询。

窗口函数并没有根本改变 SQL 无序集合的基础,还是会有许多有序运算难以解决。比如我们经常用来举例的,计算一支股票最长连续上涨了多少天:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
select max(ContinuousDays) from (
    select count(*) ContinuousDays from (
        select sum(UpDownTag) over (order by TradeDate) NoRisingDays from (
            select TradeDate,case when Price>lag(price) over ( order by TradeDate) then 0 else 1 end UpDownTag from Stock ))
    group by NoRisingDays )
select max(ContinuousDays) from (
    select count(*) ContinuousDays from (
        select sum(UpDownTag) over (order by TradeDate) NoRisingDays from (
            select TradeDate,case when Price>lag(price) over ( order by TradeDate) then 0 else 1 end UpDownTag from Stock ))
    group by NoRisingDays )

自然思维是这样,按日期排序后开始计数,碰到涨了就加 1,跌了就清 0,看计数器最大计到几。但这个思路写不出 SQL,只能绕成这样多层嵌套的。 这个问题真地是当作应聘考题的,通过率不到 20%。

这么一个简单的例子就能暴露出 SQL 缺失的能力,SQL 缺失的内容还有更多,限于篇幅,这里就不再深入讨论了。 反正结果就是,SQL 实现查询时无法应用自然思路,经常需要绕路迂回,写得又长又难懂。 现实任务要远远比这些例子复杂,过程中会面临诸多大大小小的困难。这个问题绕一下,那个问题多几行,一个稍复杂的任务写出几百行多层嵌套的 SQL 也就不奇怪了,过两月自己也看不懂也不奇怪了。 事实上 SQL 一点也不容易。

SQL 很难写怎么办?用 esProc SPL! esProc SPL 是个 Java 写的开源软件,在这里https://github.com/SPLWare/esProc。 SPL 在 SQL 已有的集合化基础上增加了离散性,从而获得了彻底的集合化和有序能力,上面的例子就 SPL 就可以延用自然思路写出来: 所有产品销售额都在前 10 名的销售员,按产品分组,取每个组的前 10 名再算交集;

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
T.group(product).(~.top(10;-amount)).isect()
T.group(product).(~.top(10;-amount)).isect()

SPL 支持集合的集合,top 也只是常规的聚合计算,有了这些基础,实现自然思路很容易。 一支股票最长连续上涨了多少天,只要按自然思路写就行了

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
cnt=0
Stock.sort(TradeDate).max(cnt=if(Price>Price[-1],cnt+1,0))
cnt=0
Stock.sort(TradeDate).max(cnt=if(Price>Price[-1],cnt+1,0))

SPL 有强大的有序计算能力,即使实现和上面 SQL 同样的逻辑也非常轻松:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Stock.sort(TradeDate).group@i(Price<Price[-1]).max(~.len())
Stock.sort(TradeDate).group@i(Price<Price[-1]).max(~.len())

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
每周AI论文速递(240805-240809)
Medical SAM 2: 利用 Segment Anything Model 2 实现医学图像的视频化分割
叶子的技术碎碎念
2025/04/08
850
每周AI论文速递(240805-240809)
LLMOps+DeepSeek:大模型升级一体化运维
蛇年伊始,DeepSeek凭借其卓越表现火爆出圈,让AI大模型瞬间成为街头巷尾热议的焦点,也让大众重新燃起对AGI(通用人工智能)“平民化”的信心,DeepSeek通过先进的模型架构,带来的高效率与低成本优势,加快了应用场景的百花齐放。
嘉为蓝鲸
2025/02/21
7760
LLMOps+DeepSeek:大模型升级一体化运维
深入浅出智能工作流(Agentic Workflow)|技术干货
著名 AI 学者、斯坦福大学教授吴恩达提出了 AI Agent 的四种设计方式后,Agentic Workflow(智能体工作流)立即火爆全球,多个行业都在实践智能体工作流的应用,并推动了新的 Agentic AI 探索热潮。
Botnow
2024/09/18
1K0
深入浅出智能工作流(Agentic Workflow)|技术干货
AI日报 - 2025年3月30日
▎🤖 模型进展 | Qwen2.5-Omni多模态实时交互,Gemini 2.5 Pro/GPT-4o低调升级,Claude内部思考过程揭秘。
訾博ZiBo
2025/03/29
1110
AI日报 - 2025年3月30日
谷歌AI Agent白皮书:2025年AI智能体时代来临
作者|Authors: Julia Wiesinger, Patrick Marlow and Vladimir Vuskovic
陈宇明
2025/02/26
5100
谷歌AI Agent白皮书:2025年AI智能体时代来临
AI智能体的开发流程
AI 智能体(AI Agent)的开发是一个涉及多个步骤的复杂过程,需要清晰的规划和执行。它不仅仅是训练一个模型那么简单,而是构建一个能够感知环境、做出决策并执行动作的完整系统。以下是一个较为全面的 AI 智能体开发流程概述,涵盖了从需求分析到部署维护的各个阶段。
数字孪生开发者
2025/01/11
5880
AI智能体的开发流程
“AI玩手机”原理揭秘:大模型驱动的移动端GUI智能体
在后LLM时代,随着大语言模型和多模态大模型技术的日益成熟,AI技术的实际应用及其社会价值愈发受到重视。AI智能体(AI Agent)技术通过集成行为规划、记忆存储、工具调用等机制,为大模型装上“手脚”,使其能够利用强大的多模态感知交互与推理决策能力,与真实世界进行有效交互,成为连接人类与数字世界的桥梁,并迎来前所未有的发展机遇。(了解更多关于智能体的见解:《在后LLM时代,关于新一代智能体的思考》) 。
澜舟科技
2024/11/22
3850
结构化表格也成模态!浙大TableGPT2开源,最强表格AI问世
现在正是多模态大模型的时代,图像、视频、音频、3D、甚至气象运动都在纷纷与大型语言模型的原生文本模态组合。而浙江大学及其计算机创新技术研究院的一个数十人团队也将结构化数据(包括数据库、数仓、表格、json 等)视为了一种独立模态。
机器之心
2025/02/14
2500
结构化表格也成模态!浙大TableGPT2开源,最强表格AI问世
每周AI论文速递(241104-241108)
当前构建 GUI 智能体的工作主要依赖于如 GPT-4o 和 GeminiProVision 等稳健的商业视觉语言模型 (VLM)。由于开源 VLM 在 GUI 接地和分布外 (OOD) 场景中与闭源 VLM 相比存在显著性能差距,实践者通常不愿使用开源 VLM。为推动该领域研究,我们开发了 OS-Atlas——一个在 GUI 接地和 OOD 智能体任务中表现卓越的基础 GUI 动作模型,这归功于数据和建模方面的创新。我们投入大量工程资源,开发了一个开源工具包,用于跨 Windows、Linux、MacOS、Android 和 Web 等多个平台合成 GUI 接地数据。利用此工具包,我们发布了迄今最大的开源跨平台 GUI 接地语料库,包含超过 1300 万个 GUI 元素。该数据集与模型训练创新相结合,为 OS-Atlas 理解 GUI 截图并泛化至未见界面提供了坚实基础。在涵盖移动设备、桌面设备和 Web 三个平台的六个基准上进行广泛评估后,OS-Atlas 显示出相较于之前最先进模型的显著性能提升。我们的评估还揭示了持续改进和扩展开源 VLM 智能体能力的宝贵见解。
叶子的技术碎碎念
2025/04/08
530
每周AI论文速递(241104-241108)
AI Agent框架(LLM Agent):LLM驱动的智能体如何引领行业变革,应用探索与未来展望
有很多人或许会疑惑,Agent 这个东西看起来跟 LLM 也没差得那么远,那为啥最近突然 Agent 那么火,而不称之为 LLM-Application 或者其他的词呢?这就得从 Agent 的来历上说起了,因为 Agent 是个很古老的术语,甚至可以追溯至亚里士多德和休谟等人的言论。从哲学意义上讲,“代理人”是指具有行动能力的实体,而 “代理” 一词则表示这种能力的行使或体现。而从狭义上讲,“代理”通常是指有意行动的表现; 相应地,“代理人” 一词表示拥有欲望、信念、意图和行动能力的实体。需要注意的是,代理人不仅包括人类个体,还包括物理世界和虚拟世界中的其他实体。重要的是,“代理” 的概念涉及个人的自主性,赋予他们行使意志、做出选择和采取行动的能力,而不是被动地对外部刺激做出反应。
汀丶人工智能
2024/07/05
2.8K0
AI Agent框架(LLM Agent):LLM驱动的智能体如何引领行业变革,应用探索与未来展望
每周AI论文速递(241216-241220)
尽管视频感知能力已迅速集成到大语言模型 (LMM) 中,但其驱动视频理解的基础机制仍未被充分理解。因此,该领域中的许多设计决策缺乏适当的依据或分析。训练和评估此类模型的高计算成本,加上有限的开放研究,阻碍了视频-LMM 的发展。为解决这一问题,我们进行了一项全面研究,旨在揭示有效驱动 LMM 中视频理解的因素。 我们首先批判性地审视了与视频-LMM 研究相关的高计算需求的主要贡献因素,并发现了规模一致性 (Scaling Consistency),即在较小模型和数据集 (达到临界规模) 上做出的设计和训练决策能有效迁移到更大模型上。基于这些见解,我们探索了视频-LMM 的许多视频特定方面,包括视频采样、架构、数据组成、训练计划等。例如,我们证明了训练期间的 fps (frames per second) 采样远优于均匀帧采样,并确定了哪些视觉编码器最适合视频表示。 在这些发现指导下,我们引入了 Apollo,这是一系列在不同模型规模上实现卓越性能的先进 LMM。我们的模型能够高效感知长达一小时的视频,其中 Apollo-3B 在 LongVideoBench 上以 55.1 的分数超越了大多数现有 7B 模型。Apollo-7B 在与 7B LMM 的比较中处于领先地位,在 MLVU 上获得 70.9 分,在 Video-MME 上获得 63.3 分。
叶子的技术碎碎念
2025/04/08
760
每周AI论文速递(241216-241220)
AI智能体的炒作与现实:GPT-4都撑不起,现实任务成功率不到15%
随着大语言模型的不断进化与自我革新,性能、准确度、稳定性都有了大幅的提升,这已经被各个基准问题集验证过了。
机器之心
2024/06/04
1440
AI智能体的炒作与现实:GPT-4都撑不起,现实任务成功率不到15%
谷歌刚刚发布 AI Agent 白皮书,2025 年agent时代已开启
作者:Julia Wiesinger, Patrick Marlow 和 Vladimir Vuskovic
AIGC新知
2025/01/07
1.3K0
谷歌刚刚发布 AI Agent 白皮书,2025 年agent时代已开启
深度解析RAG技术在大模型时代的原理与实践
AI 日报_硅谷 “鲁迅” 怒怼马斯克_炮轰 AI 界 * 前 OpenAI 安全主管入职友商 Anthropic
可信AI进展
2024/06/03
2.8K0
打通智能体「自我进化」全流程!复旦推出通用智能体平台AgentGym
LLM-based Agent,已经不再需要人类监督者的帮助,开始实现「自我进化」!
机器之心
2024/06/17
3880
每周AI论文速递(241028-241101)
视觉-语言模型 (Vision-language models, VLMs) 在多模态任务中表现出色,但将其应用于开放世界环境中的具身决策仍面临挑战。主要难点在于如何将低级观察中的个体实体与规划所需的抽象概念有效关联。常见的解决方案是采用分层智能体,其中 VLMs 作为高级推理器,将任务分解为可执行的子任务,通常通过语言和虚拟观察来指定。然而,语言在传达空间信息方面往往力不从心,而生成高准确性的未来图像仍具挑战。为此,我们提出了视觉-时间上下文提示,这是一种 VLMs 与策略模型之间的新型通信协议。该协议利用过去和当前观察中的对象分割来指导策略与环境的交互。基于此,我们训练了 ROCKET-1,一个根据连接的视觉观察和分割掩码预测动作的低级策略,实时对象跟踪由 SAM-2 提供。我们的方法充分发挥了 VLMs 的视觉-语言推理能力,使其能够解决复杂的创造性任务,特别是那些高度依赖空间理解的任务。在 Minecraft 中的实验表明,我们的方法使智能体能够完成以往难以完成的任务,突显了视觉-时间上下文提示在具身决策中的有效性。代码和演示将在项目页面上提供:https://craftjarvis.github.io/ROCKET-1。
叶子的技术碎碎念
2025/04/08
670
每周AI论文速递(241028-241101)
上海 AI Lab 提出 GenAgent | 使用自动工作流程生成构建协作AI 系统-ComfyUl 上的案例研究 !
近期AI的发展被日益重要的协作AI系统的成功所定义,这些系统整合了多种模型和工具作为整体协作系统。ChatGPT Plus(OpenAI,2024年)的成功表明将诸如网页浏览、图像生成和代码执行等任务集成到一个单一的聊天代理的可能性。与传统AI模型作为单一实体的不同,协作AI系统整合多个AI组件,每个组件贡献独特的能力来解决复杂问题。向整合方向的转变对于实现最先进的结果至关重要,因为整合了多样AI功能的优势在一个统一框架内。
AIGC 先锋科技
2024/09/26
1900
上海 AI Lab 提出 GenAgent | 使用自动工作流程生成构建协作AI 系统-ComfyUl 上的案例研究 !
Cell | 前瞻性分析:AI智能体赋能生物学发现
今天为大家介绍的是来自哈佛医学院Marinka Zitnik团队的一篇论文。作者设想“AI科学家”是能够进行批判性学习和推理的系统,它们通过协作型智能体整合AI模型、生物医学工具和实验平台,从而推动生物医学研究的发展。这些生物医学AI智能体并不是要将人类排除在发现过程之外,而是将人类的创造力与专业知识,与AI在分析大型数据集、探索假设空间以及执行重复性任务方面的能力结合在一起。AI智能体在各种任务中将表现出色,包括规划发现工作流程、进行自我评估以识别并弥补知识空白。这些智能体利用大语言模型和生成模型,具备结构化记忆能力以实现持续学习,并使用机器学习工具整合科学知识、生物学原理和理论。AI智能体的应用领域广泛,包括虚拟细胞模拟、表型的可编程控制、细胞电路设计以及新疗法的开发等方面。
DrugAI
2024/12/23
1810
Cell | 前瞻性分析:AI智能体赋能生物学发现
2024技术总结:LLM之RAG技术全栈进化解析、Agent应用案例精选、LLM大模型部署实战指南
嘿,大家好!作为一名技术宅,我在2024年与AI的大型语言模型(LLM)技术有了不少“亲密接触”,感觉就像是和一位日益聪明的老友并肩前行。
汀丶人工智能
2025/01/25
6740
2024技术总结:LLM之RAG技术全栈进化解析、Agent应用案例精选、LLM大模型部署实战指南
智能体首次达到Kaggle Grandmaster水平,华为用结构化推理补齐思维链短板
前些时日,AI 大模型开始掌握操作计算机的能力,但整体而言,它们与物理世界互动的能力仍处于早期阶段。
机器之心
2025/02/14
1360
智能体首次达到Kaggle Grandmaster水平,华为用结构化推理补齐思维链短板
推荐阅读
相关推荐
每周AI论文速递(240805-240809)
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档