0

0

SQL 为什么窗口函数是高级 SQL 分水岭?

冷炫風刃

冷炫風刃

发布时间:2026-01-26 18:49:53

|

308人浏览过

|

来源于php中文网

原创

窗口函数让“既要聚合、又要明细”成为可能,通过OVER()子句在不丢失原始行的前提下实现分组聚合与排序计算,支持LAG/LEAD环比、ROWS BETWEEN滚动计算等高级分析,是高级SQL能力的分水岭。

sql 为什么窗口函数是高级 sql 分水岭?

窗口函数让“既要聚合、又要明细”变成一句废话

传统 GROUP BY 一执行,原始行就没了——想看每个员工的工资,又想看他们部门平均工资?得写子查询或自连接。窗口函数直接在 SELECT 里加个 AVG(salary) OVER (PARTITION BY dept),每行都带着自己部门的均值回来,不丢数据、不增行数。

  • 常见错误:把 OVER() 漏写或写成空括号,结果变成全表窗口(比如全公司平均),而不是按部门算
  • ORDER BY 在窗口里不是可选的:用 ROW_NUMBER() 或计算累计和时,没 ORDER BY 会报错或返回不可靠结果
  • MySQL 8.0+、PostgreSQL、SQL Server 2012+、Oracle、Doris、StarRocks 都支持;但 SQLite(除非是最新 dev 版)和旧版 Hive 不支持

LAG()LEAD() 是环比/同比的底层开关

做月度销售环比,不用再拼日期逻辑 + 左连接上个月表。一行 LAG(amount) OVER (PARTITION BY region ORDER BY sale_month) 就能拿到上月值,再跟当前行做减法除法就行。

  • 容易踩坑:如果 sale_month 有缺失(比如某地区某月没数据),LAG() 会跳过空值取更早的,导致“上月”错位——建议先用 GENERATE_SERIES 或补全月份再开窗
  • LAG(col, 2) 表示取前两行,不是“上个月”,顺序完全依赖 ORDER BY 的列和方向
  • 性能上比自连接快 2–3 倍(实测百万级订单表,窗口函数耗时约 800ms,等效自连接 2.5s)

ROWS BETWEEN 控制移动窗口,不是玄学

算 7 日滚动销售额?不是靠应用层循环,而是数据库原生支持:SUM(amount) OVER (ORDER BY order_date ROWS BETWEEN 6 PRECEDING AND CURRENT ROW)。这里 ROWS 看的是物理行序,RANGE 看的是值范围(比如 “过去 7 天” 要用 RANGE INTERVAL '6 days' PRECEDING,但仅 PostgreSQL/Oracle 支持)。

绘蛙AI商品图
绘蛙AI商品图

电商场景的AI创作平台,无需高薪聘请商拍和文案团队,使用绘蛙即可低成本、批量创作优质的商拍图、种草文案

下载
  • MySQL 不支持 RANGE + INTERVAL,只能用 ROWS + 排序后硬凑天数,遇到重复日期可能不准
  • UNBOUNDED PRECEDING 是安全写法,但别滥用——没 PARTITION BY 时,它会让窗口跨全表,大表易 OOM
  • 排序字段必须有索引,否则 ORDER BY + 窗口框架会触发 filesort,拖慢几倍

为什么它是高级 SQL 的分水岭?

因为能否用好窗口函数,直接暴露你是在写“能跑就行”的 SQL,还是在构建可维护、可复用、可下推的数据逻辑。它不解决“查不到”的问题,而是解决“查出来没法直接用”的问题——比如运营要一份带排名、带累计、带环比、还保留用户 ID 的明细报表,不用窗口函数就得四张临时表嵌套三层子查询。而一个写对的 OVER() 子句,就是把这四步压进一行表达式里。

真正卡住人的从来不是语法,而是想清楚:我要的“窗口”,到底该按什么分(PARTITION BY)、按什么排(ORDER BY)、框多大(ROWS/RANGE)。这三个条件少一个,结果就偏一点;错一个,整张报表就废掉。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
数据分析工具有哪些
数据分析工具有哪些

数据分析工具有Excel、SQL、Python、R、Tableau、Power BI、SAS、SPSS和MATLAB等。详细介绍:1、Excel,具有强大的计算和数据处理功能;2、SQL,可以进行数据查询、过滤、排序、聚合等操作;3、Python,拥有丰富的数据分析库;4、R,拥有丰富的统计分析库和图形库;5、Tableau,提供了直观易用的用户界面等等。

706

2023.10.12

SQL中distinct的用法
SQL中distinct的用法

SQL中distinct的语法是“SELECT DISTINCT column1, column2,...,FROM table_name;”。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

327

2023.10.27

SQL中months_between使用方法
SQL中months_between使用方法

在SQL中,MONTHS_BETWEEN 是一个常见的函数,用于计算两个日期之间的月份差。想了解更多SQL的相关内容,可以阅读本专题下面的文章。

348

2024.02.23

SQL出现5120错误解决方法
SQL出现5120错误解决方法

SQL Server错误5120是由于没有足够的权限来访问或操作指定的数据库或文件引起的。想了解更多sql错误的相关内容,可以阅读本专题下面的文章。

1180

2024.03.06

sql procedure语法错误解决方法
sql procedure语法错误解决方法

sql procedure语法错误解决办法:1、仔细检查错误消息;2、检查语法规则;3、检查括号和引号;4、检查变量和参数;5、检查关键字和函数;6、逐步调试;7、参考文档和示例。想了解更多语法错误的相关内容,可以阅读本专题下面的文章。

360

2024.03.06

oracle数据库运行sql方法
oracle数据库运行sql方法

运行sql步骤包括:打开sql plus工具并连接到数据库。在提示符下输入sql语句。按enter键运行该语句。查看结果,错误消息或退出sql plus。想了解更多oracle数据库的相关内容,可以阅读本专题下面的文章。

778

2024.04.07

sql中where的含义
sql中where的含义

sql中where子句用于从表中过滤数据,它基于指定条件选择特定的行。想了解更多where的相关内容,可以阅读本专题下面的文章。

579

2024.04.29

sql中删除表的语句是什么
sql中删除表的语句是什么

sql中用于删除表的语句是drop table。语法为drop table table_name;该语句将永久删除指定表的表和数据。想了解更多sql的相关内容,可以阅读本专题下面的文章。

420

2024.04.29

拼多多赚钱的5种方法 拼多多赚钱的5种方法
拼多多赚钱的5种方法 拼多多赚钱的5种方法

在拼多多上赚钱主要可以通过无货源模式一件代发、精细化运营特色店铺、参与官方高流量活动、利用拼团机制社交裂变,以及成为多多进宝推广员这5种方法实现。核心策略在于通过低成本、高效率的供应链管理与营销,利用平台社交电商红利实现盈利。

31

2026.01.26

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
MySQL 教程
MySQL 教程

共48课时 | 1.9万人学习

MySQL 初学入门(mosh老师)
MySQL 初学入门(mosh老师)

共3课时 | 0.3万人学习

简单聊聊mysql8与网络通信
简单聊聊mysql8与网络通信

共1课时 | 811人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号