当前位置: 首页 > news >正文

SQL窗口函数实践笔记

好,这个题目非常偏“进阶 SQL + 面试/实战”,我就直接给你一份能抄走用、也能讲给面试官听的《SQL 窗口函数实践笔记》
不灌水,**以“为什么 → 怎么写 → 什么时候用”**为主。


SQL 窗口函数实践笔记(Window Functions)


一、为什么要用窗口函数?

一句话概括:

窗口函数 = 在“不减少行数”的前提下做统计分析

对比一下 👇

传统 GROUP BY 的问题

SELECTdept,AVG(salary)FROMempGROUPBYdept;

窗口函数能做到什么?

SELECTname,dept,salary,AVG(salary)OVER(PARTITIONBYdept)ASdept_avgFROMemp;

✅ 行不丢
✅ 统计结果“贴”在每一行上


二、窗口函数的基本语法(核心)

函数名(...)OVER(PARTITIONBY...ORDERBY...ROWS/RANGE...)
子句作用
PARTITION BY分组(逻辑分组,不合并行)
ORDER BY窗口内排序
ROWS / RANGE窗口范围

三、常用窗口函数分类


1️⃣ 聚合类窗口函数

示例:部门平均工资
AVG(salary)OVER(PARTITIONBYdept)

常见函数:

📌区别于 GROUP BY:不合并行


2️⃣ 排名类窗口函数(高频)

ROW_NUMBER(不并列)
ROW_NUMBER()OVER(PARTITIONBYdeptORDERBYsalaryDESC)
RANK(并列跳号)
RANK()OVER(ORDERBYscoreDESC)
DENSE_RANK(并列不跳号)
DENSE_RANK()OVER(ORDERBYscoreDESC)
分数RANKDENSE_RANK
10011
9022
9022
8043

3️⃣ 偏移函数(分析神器)

LAG / LEAD
LAG(salary,1)OVER(ORDERBYmonth)

👉 取“上一行 / 下一行”的值

常见场景


4️⃣ 分布类函数(了解)


四、窗口范围(ROWS vs RANGE)

1️⃣ ROWS(基于行)

ROWSBETWEEN2PRECEDINGANDCURRENTROW

2️⃣ RANGE(基于值)

RANGEBETWEENUNBOUNDEDPRECEDINGANDCURRENTROW

📌实战建议:优先 ROWS


五、实战案例(直接可用)


1️⃣ 每个部门工资排名 Top 3

SELECT*FROM(SELECTname,dept,salary,ROW_NUMBER()OVER(PARTITIONBYdeptORDERBYsalaryDESC)ASrnFROMemp)tWHERErn<=3;

🔥 面试必会


2️⃣ 计算工资环比增长

SELECTmonth,salary,salary-LAG(salary)OVER(ORDERBYmonth)ASdiffFROMemp_salary;

3️⃣ 累计求和

SUM(sales)OVER(ORDERBYdayROWSBETWEENUNBOUNDEDPRECEDINGANDCURRENTROW)AStotal_sales

4️⃣ 去重保留最新一条

SELECT*FROM(SELECT*,ROW_NUMBER()OVER(PARTITIONBYuser_idORDERBYupdate_timeDESC)rnFROMuser_log)tWHERErn=1;

六、窗口函数执行顺序(面试点)

SQL 执行顺序(简化):

FROM → WHERE → GROUP BY → HAVING → SELECT → WINDOW FUNCTION → ORDER BY

📌 窗口函数不能写在 WHERE 中


七、性能 & 实战注意点


八、MySQL / PostgreSQL / Oracle 支持情况


九、面试一句话总结

窗口函数用于在不合并结果行的情况下进行排序、排名和统计分析,是分析型 SQL 的核心能力,常用于 TopN、环比、累计值等场景。


十、速记口诀(很有用)

GROUP BY 会合并行,窗口函数不合并;
排名用 ROW_NUMBER,分析用 LAG/LEAD。


如果你愿意,我可以下一步直接帮你:

你是数据分析 / 后端开发 / 面试准备哪个方向?

http://www.jsqmd.com/news/333880/

相关文章:

  • 2026年零食品牌排行前十新鲜出炉:安全靠谱的零食品牌推荐及挑选指南和选购建议 - Top品牌推荐
  • Python 开发企微第三方 API:RPA 模式下外部群主动调用实现
  • 【C语言】 关键字与用户标识符
  • python变量详解
  • linux 中sed命令对指定步长行进行处理
  • Anthropic推出Claude Cowork插件功能增强任务自动化能力
  • 99999999999999
  • [STM32L5] STM32L562E-DK硬件和DEMO程序演示
  • 【重磅】正规的腾讯广告排行榜单 - 服务品牌热点
  • 【艾思科蓝推荐】2026 计算机科学与技术/电子与通信/人工智能领域国际学术会议汇总 | 2026年3月学术会议征稿信息速览 | EI/Scopus稳定检索,高录用,适合硕博毕业/职称评审/项目结题
  • plc教程系列篇(二),plc教程之5大编程语言类型介绍
  • # Vue3 音频标注插件 wavesurfer
  • 探索Matlab/Simulink三闭环直流电机调速系统仿真
  • 写给技术管理者的低代码手册系列文章(1)——从软件工程视角理解低代码的价值、边界与演进路径
  • 【Linux指南】Linux粘滞位详解:解决共享目录文件删除安全隐患
  • LangChain学习2 完成一个mysql数据库管理的示例agent
  • 高压直流输电在线监测Matlab仿真模型及GUI界面设置参数设计
  • [STM32L5] 【STM32L562E-DK试用】第4辑:板载蓝牙的体验
  • 2000-2024年 上市公司异质性机构投资者数据+Stata代码
  • 开源免焊接UART短信转发终端:实现不依赖流量的数据传输
  • 9999999999999999
  • 低代码:让钣金工厂的 “钢铁拼图” 跑赢数字化时代
  • 如何设计一个可扩展的短信发送队列模块
  • 现代互联网安全的基石: SSL/TLS技术介绍
  • 从外包菜鸟到高手,XinServer 是我的秘密武器
  • SSM毕设项目推荐-基于Java+MySQL+SSM商铺租赁管理系统设计与实现基于ssm的商铺租赁管理系统的设计与实现【附源码+文档,调试定制服务】
  • [STM32L5] 【STM32L562E-DK试用】第3辑:板子Flash芯片测试(OSPI)
  • 写论文省心了!更贴合本科生的AI论文软件,千笔·专业论文写作工具 VS 灵感风暴AI
  • _fsm和_vm文件
  • 【Linux命令大全】008.磁盘维护之swapon命令(实操篇)