用YEAR() + OVER()可高效实现年度汇总,需先提取年份再分区计算同比和排名,避免全局排序错误;注意数据库兼容性及分区键必须包含客户ID和年份。用 YEAR() + OVER() 替代子查询拼年度汇总年度报表最常卡在"每个客户每年的销售额、同比、排名"这类需求上。传统写法是多层子查询或临时表,可读性差、改起来像拆炸弹。窗口函数能直接在单次扫描中完成分组内计算,关键是得把时间维度对齐到年粒度。常见错误是直接对 order_date 用 OVER (PARTITION BY customer_id),结果发现同比算乱了------因为没按年切片。必须先提取年份,再作为分区依据:SELECT customer_id, YEAR(order_date) AS y, SUM(amount) AS yearly_amount, LAG(SUM(amount), 1) OVER (PARTITION BY customer_id ORDER BY YEAR(order_date)) AS prev_year_amountFROM ordersGROUP BY customer_id, YEAR(order_date);YEAR(order_date) 必须出现在 GROUP BY 和 ORDER BY 中,否则窗口排序无意义MySQL 8.0+、PostgreSQL、SQL Server 都支持;但 SQLite 不支持窗口函数,别踩坑如果日期字段含时分秒,YEAR() 没问题;但若用 DATE_FORMAT(order_date, '%Y')(MySQL)或 EXTRACT(YEAR FROM order_date)(PostgreSQL),语法要对应数据库避免 ROW_NUMBER() 在年度内错排客户TOP3"每家客户每年销售额最高的3个产品"这种需求,容易误用全局 ROW_NUMBER() OVER (ORDER BY amount DESC),结果排出来的是全量TOP3,不是"每年各算一遍"。核心是分区键必须包含年份和客户ID。典型错误写法:ROW_NUMBER() OVER (ORDER BY amount DESC) ------ 完全没分区,顺序随机且不可控。正确做法: 知网AI智能写作 知网AI智能写作,写文档、写报告如此简单
相关推荐
兵慌码乱1 小时前
面向桌面端的资产管理系统分层架构设计与核心模块实现hboot3 小时前
AI工程师第三课 - 机器学习基础顾林海8 小时前
Agent入门阶段-编程基础-Python:流程控制呱呱复呱呱10 小时前
Django CBV 源码解读:一个请求是怎么找到你的 get() 方法的Nturmoils11 小时前
订单列表慢查询,先看 WHERE、ORDER BY 和 LIMIT曲幽15 小时前
刚部署的 LibreTranslate 频频翻车?我掏出了 20 年前的 StarDict 词典,用 FastAPI 搭了个本地词典翻译 API渣波15 小时前
拒绝 SQL 焦虑!手把手带你用 NestJS + Prisma + DTO 写出“防弹”级后端代码荣码15 小时前
用Streamlit给AI应用套个界面,10行代码出Web页面兵慌码乱1 天前
基于Python+PyQt5+SQLite的药房管理系统实现:事务一致性与界面解耦全流程解析金銀銅鐵1 天前
[Python] 体验用欧几里得算法计算最大公约数的过程