sql窗口函数

579 字
3 分钟
sql窗口函数

窗口函数和聚合函数的区别#

聚合函数#

会压缩行数

SELECT SUM(amount) FROM payment
image-20260409095432243

窗口函数#

SELECT payment_date,
amount,
SUM(amount) OVER () AS total_sum -- 没有分组,就算全部的和
FROM payment
image-20260409100122248

对比#

对比项聚合函数窗口函数
行数影响合并多行为一行不减少行数
使用方式一般与GROUP BY配合与OVER()子句配合
适用场景汇总统计分区统计、行间比较、累计计算、百分百计算等

sql窗口函数#

窗口函数是一个统称(也叫分析函数),它并不是一个具体的函数,而是一种 “函数使用方式”—— 把普通的聚合函数、排名函数等放到 OVER() 子句中,就变成了窗口函数。

窗口函数的结构是:函数名() OVER (窗口子句),其中函数名可以替换成多种类型的函数,OVER() 子句定义 “计算窗口”(分组、排序、范围)

聚合类窗口函数(最常用)#

  1. SUM(): 分组累计求和(如累计利润)
SUM(profit) OVER (
PARTITION BY shop_id
ORDER BY profit_date)

​ 2.AVG():分组滚动求平均(如班级平均分趋势)

AVG(score) OVER (
PARTITION BY class
ORDER BY exam_date)
  1. MAX()/MIN():分组内取极值(如每个学校的最高 GPA)
MAX(gpa) OVER (
PARTITION BY university)
  1. COUNT(): 分组内统计行数(如每个部门的人数)
COUNT(*) OVER (
PARTITION BY dept)

排名类窗口函数(仅限作为窗口)#

这类函数只能作为窗口函数使用,无法单独用,核心用于生成排名、序号。

排名函数用法示例作用
ROW_NUMBER()ROW_NUMBER() OVER (PARTITION BY university ORDER BY gpa DESC)分组内连续排名(1,2,3…,无并列)
RANK()RANK() OVER (ORDER BY score DESC)跳跃排名(1,2,2,4…,并列会跳过序号)
DENSE_RANK()DENSE_RANK() OVER (ORDER BY score DESC)连续排名(1,2,2,3…,并列不跳过序号)
NTILE(n)NTILE(4) OVER (ORDER BY sales)分组内分桶(如把销售额分成 4 个等级)

偏移类窗口函数(仅限作为窗口函数)#

偏移函数用法示例作用
LAG()LAG(profit, 1) OVER (ORDER BY profit_date)获取上 1 行的利润(计算日环比)
LEAD()LEAD(profit, 7) OVER (ORDER BY profit_date)获取下 7 行的利润(计算周同比)
FIRST_VALUE()FIRST_VALUE(gpa) OVER (PARTITION BY university ORDER BY gpa)分组内第一行的 GPA(最低 GPA)
LAST_VALUE()LAST_VALUE(gpa) OVER (PARTITION BY university ORDER BY gpa)分组内最后一行的 GPA(最高 GPA)

支持与分享

如果这篇文章对你有帮助,欢迎分享给更多人或赞助支持!

赞助
sql窗口函数
https://ztl123z.github.io/posts/sql窗口函数/
作者
三叶草
发布于
2026-04-09
许可协议
CC BY-NC-SA 4.0

评论区

Profile Image of the Author
三叶草
Hello, I'm Clover.
公告
欢迎来到三叶草☘️的博客
音乐
封面

音乐

暂未播放

0:00 0:00
暂无歌词
分类
标签
站点统计
文章
47
分类
14
标签
53
总字数
52,789
运行时长
0
最后活动
0 天前

目录