SQLazy:分组累计求和
问题描述只保留开票行金额累计从上次开票开始有一张业务流水表包含 ID、Date、Invoiced 和 Amount 四个字段。每个月有一条记录其中 Invoiced1 表示该月开了发票。现在要输出每个 ID 下所有开票月份并且每张发票的金额等于自上个月开票或开始到当前月所有金额的总和包括当前发票本身。源数据IDDateInvoicedAmountAAA2023-01010AAA2023-02015AAA2023-03115AAA2023-04010AAA2023-05010AAA2023-06110BBB2022-05040BBB2022-06120BBB2022-07030BBB2022-08130期望结果只保留开票行每行 Amount 是自上次开票以来的累计值。IDDateInvoicedAmountAAA2023-03140AAA2023-06130BBB2022-06160BBB2022-08160以 AAA 为例第一张发票 2023-03之前有 1 月 (10) 2 月 (15) 自身 (15) 40第二张发票 2023-06上次发票之后有 4 月 (10) 5 月 (10) 自身 (10) 30BBB 同理。SQLazy 分步实现ValueAnchorStatementt1invoicesort id,dt desct2compute invoiced cum as grp partition idt3summarize dt max as dt invoiced max as invoiced amount sum as amount group id grpt4derive id dt invoiced amount下面分别解释一下这些步骤。第 1 步按 ID 和日期排序日期降序sort id,dt desc这一步是为了后续分组做准备。降序排列后一个发票行与它前面的非开票行会先被处理累计求和时这些行会被归入同一组。第 2 步对 invoiced 做累计求和生成分组号compute invoiced cum as grp partition id在每个 ID 分区内按当前顺序降序对 invoiced 进行累计求和包括当前行。结果如下第 3 步按 ID 和 grp 分组汇总summarize dt max as dt invoiced max as invoiced amount sum as amount group id grpdt max因为降序每组内日期最大的是开票月份发票行的日期。invoiced max每组至少有一个 invoiced1所以最大值是 1。amount sum累加该组所有金额即自该发票以来包括自身的总和。第 4 步选择需要的列derive id dt invoiced amount这一步只是清理输出去掉辅助列 grp。编译生成 SQL完成上述步骤后通过 SQLazy 的编译器可以生成等价的原生 SQL无需手动编写。这里生成 MySQL 语句WITH t3 AS ( SELECT id, grp, MAX(dt) AS dt, MAX(invoiced) AS invoiced, SUM(amount) AS amount FROM ( SELECT id, dt, invoiced, amount, SUM(invoiced) OVER ( PARTITION BY id ORDER BY CASE WHEN id IS NULL THEN 1 ELSE 0 END, id ASC, CASE WHEN dt IS NULL THEN 1 ELSE 0 END, dt DESC ROWS UNBOUNDED PRECEDING ) AS grp FROM invoice ) t2 GROUP BY id, grp ) SELECT id, dt, invoiced, amount FROM t3 ORDER BY id, grp你不需要读懂或调试这段 SQL只需确认前面四步的逻辑正确编译器就会输出可运行的代码。列个表格总结一下传统 SQLSQLazy步骤数多层 CTE 窗口函数边界4 步排序→累计→汇总→选列核心技巧晦涩的 ROWS BETWEEN UNBOUNDED PRECEDING AND 1 PRECEDING直观的“降序 累计求和”可读性低需要理解偏移窗口高步骤即思考过程调试方式手动拆解 CTE反复运行单步执行每一步中间结果可见跨数据库需手动调整方言差异编译器自动生成对应语法这个实例展示了 SQLazy 处理“按事件重置的累计”类问题的自然性通过一个简单的排序技巧加上累计求和就能把复杂的分组逻辑拆解为清晰的动作。

相关新闻

【每日规划与反思】2026.9.1

【每日规划与反思】2026.9.1

一. 计划:1. it视频观看2-3节(1*)2. 成熟度需求评估怎么做(1.5*)3. 代码笔记50%(1*)4. 2节提示笔记实践整理50%(1*)5. 看书《谈判》1节(1*)6. 俯卧…

2026/10/24 5:42:25 阅读更多 →
Python动态折线图实战:用matplotlib动画可视化时间序列数据

Python动态折线图实战:用matplotlib动画可视化时间序列数据

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/11/1 17:29:07 阅读更多 →
Java四舍五入取整?Math.round()一出手,小数点秒变整数

Java四舍五入取整?Math.round()一出手,小数点秒变整数

Java中有哪些方法可以实现四舍五入取整?想问一下, 在Java编程这个范畴里, 存在哪一些常常会被用到的方法, 或者是函数, 能够用来针对浮点数开展四舍五入,进而实现取整操作呢?Java实现四舍五入的常用方法Java里面常用的达成四舍五入取整的办法有Math.round()那个办法…

2026/10/24 12:21:43 阅读更多 →

最新新闻

Electron桌面应用开发实战:从环境搭建到打包发布全流程

Electron桌面应用开发实战:从环境搭建到打包发布全流程

做前端这些年,我大部分时间都在跟浏览器标签页打交道,直到第一次把桌面应用跑起来,才发现原来自己一直被限制在地址栏和刷新按钮围起来的框框里。Electron这个词,最开始是在某段时间频繁出现在同事的讨论里,一个用HTML…

2026/11/2 0:25:10 阅读更多 →
滑盖智能锁T109深度解析:结构原理、安装调试与故障排查

滑盖智能锁T109深度解析:结构原理、安装调试与故障排查

简介:亚太天能T109滑盖智能锁产品说明书是一份PDF格式的官方技术文档,主要面向智能锁安装人员、终端用户及售后维护者,帮助快速掌握产品安装、配置与常见故障处理。全包仅1个PDF文件,大小4.37MB,内容结构清晰&#xff…

2026/11/1 10:36:53 阅读更多 →
PMSM弱磁控制原理与Simulink建模:高速AGV驱动系统设计指南

PMSM弱磁控制原理与Simulink建模:高速AGV驱动系统设计指南

上个月我在调试一台高速AGV的驱动系统,整车要求空载跑到8m/s,电机转速已经拉到额定点,驱动器的输出电压也顶到了母线电压极限附近。再往上踩速度指令,转速纹丝不动,三相电流反而开始震荡。那会儿我的第一反应就是&…

2026/11/1 10:36:51 阅读更多 →
C++核心知识点:从内存管理到STL的实战指南

C++核心知识点:从内存管理到STL的实战指南

C 这门语言我前前后后折腾了十几年,用它写过嵌入式驱动、做过游戏服务端,也搭过基础组件库。每次看到新人一头扎进"C 核心知识点"这个搜索词,我其实挺感慨的——这门语言的难点从来不是语法多,而是知识点之间的耦合太深…

2026/11/2 1:16:51 阅读更多 →
T109滑盖智能锁怎么装?安装调试与故障排查全攻略

T109滑盖智能锁怎么装?安装调试与故障排查全攻略

简介:亚太天能T109滑盖智能锁产品说明书以PDF格式发布,适合智能锁用户、安装人员与售后维修人员阅读。内容围绕T109系列指纹密码刷卡锁展开,先介绍前面板、后面板、锁体、机械钥匙、电池盒盖等部件名称与功能,再给出完整安装步骤&…

2026/11/1 10:35:11 阅读更多 →
LLM知识降熵:从信息垄断到理解权下放

LLM知识降熵:从信息垄断到理解权下放

你有没有过这种经历:翻开源码注释、论文摘要或者一份专业报告,每个字都认识,连在一起却像天书。想找人聊聊,身边要么没人懂,要么懂的懒得跟你解释。后来我试着把同一段内容丢给一个大语言模型,几秒钟之后&a…

2026/11/1 9:35:41 阅读更多 →

日新闻

周新闻

月新闻