sql窗口函数
579 字
3 分钟
sql窗口函数
窗口函数和聚合函数的区别
聚合函数
会压缩行数
SELECT SUM(amount) FROM payment
窗口函数
SELECT payment_date, amount, SUM(amount) OVER () AS total_sum -- 没有分组,就算全部的和FROM payment
对比
| 对比项 | 聚合函数 | 窗口函数 |
|---|---|---|
| 行数影响 | 合并多行为一行 | 不减少行数 |
| 使用方式 | 一般与GROUP BY配合 | 与OVER()子句配合 |
| 适用场景 | 汇总统计 | 分区统计、行间比较、累计计算、百分百计算等 |
sql窗口函数
窗口函数是一个统称(也叫分析函数),它并不是一个具体的函数,而是一种 “函数使用方式”—— 把普通的聚合函数、排名函数等放到 OVER() 子句中,就变成了窗口函数。
窗口函数的结构是:函数名() OVER (窗口子句),其中函数名可以替换成多种类型的函数,OVER() 子句定义 “计算窗口”(分组、排序、范围)
聚合类窗口函数(最常用)
- SUM(): 分组累计求和(如累计利润)
SUM(profit) OVER ( PARTITION BY shop_id ORDER BY profit_date) 2.AVG():分组滚动求平均(如班级平均分趋势)
AVG(score) OVER ( PARTITION BY class ORDER BY exam_date)- MAX()/MIN():分组内取极值(如每个学校的最高 GPA)
MAX(gpa) OVER ( PARTITION BY university)- 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) |
支持与分享
如果这篇文章对你有帮助,欢迎分享给更多人或赞助支持!
相关文章 智能推荐
1
ansible-docker-deploy
linux ansible-docker-deploy学习
2
K8S从入门到实战(2)
运维 Kubernetes(k8s)入门到实战教程丨全新升级完整版
3
Jenkins持续集成从入门到精通
linux RockyLinux初始化
4
RockyLinux初始化
linux RockyLinux初始化
5
镜像仓库harbor
docker 镜像仓库harbor
随机文章 随机推荐