新闻中心
如何在SQL中使用窗口函数?RANK、ROWNUMBER的应用
窗口函数在保留原行数基础上添加统计结果,如RANK和ROWNUMBER用于排序,前者对相同值并列排名并跳号,后者连续编号;与GROUP BY不同,窗口函数不减少行数,可同时显示明细与聚合数据,适用于移动平均、累计求和、Top N查询等场景。

窗口函数,说白了,就是在SQL查询中,让你能在每一行数据旁边,加上一些“额外的统计信息”。它不像 GROUP BY 那样会改变行的数量,而是保持原有行数不变,只是多了几列“窗口”计算出来的结果。RANK 和 ROWNUMBER 算是窗口函数里比较常用的了,它们主要用来进行排序。
SQL窗口函数,主要就是为了在查询结果中,既能看到明细数据,又能看到基于这些数据计算出来的聚合结果。
RANK、ROWNUMBER的应用:直接在SELECT语句中使用 OVER() 子句来定义窗口。OVER() 子句里面可以指定PARTITION BY(分组)和ORDER BY(排序)子句。
窗口函数与GROUP BY的区别是什么?
GROUP BY 会将数据按照指定的列进行分组,然后对每个组进行聚合计算,最终返回每个组的聚合结果,行的数量会减少。而窗口函数不会改变行的数量,它只是在每一行旁边添加一些基于窗口的计算结果。简单来说,GROUP BY 是用来做聚合的,窗口函数是用来做“增强”的。
举个例子,你想统计每个部门的平均工资,并显示每个员工的工资和部门平均工资。用 GROUP BY 只能得到每个部门的平均工资,看不到每个员工的工资。但用窗口函数,就能同时看到每个员工的工资和该员工所在部门的平均工资。
SELECT
employee_name,
salary,
*G(salary) OVER (PARTITION BY department_id) AS department_*g_salary
FROM
employees;这个例子中,
*G(salary) OVER (PARTITION BY department_id)就是一个窗口函数。
PARTITION BY department_id表示按照部门分组,
*G(salary)计算每个部门的平均工资。结果集中,每一行都会显示员工姓名、工资和该员工所在部门的平均工资。
RANK 和 ROWNUMBER 的具体用法及区别?
RANK 和 ROWNUMBER 都是用来给结果集中的行进行排序的,但它们的行为略有不同。
ROWNUMBER(): 简单粗暴地给每一行分配一个唯一的序号,从1开始,按照ORDER BY子句指定的顺序递增。即使ORDER BY的列有相同的值,ROWNUMBER() 也会分配不同的序号。
RANK(): 会考虑ORDER BY子句中相同的值。如果两行的排序值相同,RANK() 会给它们分配相同的排名,并跳过后续的排名。例如,如果有两行排名都是第2,那么下一行的排名就是第4,而不是第3。
-- ROWNUMBER() 示例
SELECT
product_name,
price,
ROW_NUMBER() OVER (ORDER BY price DESC) AS row_num
FROM
products;
-- RANK() 示例
SELECT
product_name,
price,
RANK() OVER (ORDER BY price DESC) AS rank_num
FROM
products;假设
products表中有三条数据:
Krisp
AI噪音消除工具
135
查看详情
| product_name | price |
|---|---|
| A | 100 |
| B | 100 |
| C | 90 |
ROWNUMBER() 的结果会是:
| product_name | price | row_num |
|---|---|---|
| A | 100 | 1 |
| B | 100 | 2 |
C |
90 | 3 |
RANK() 的结果会是:
| product_name | price | rank_num |
|---|---|---|
| A | 100 | 1 |
| B | 100 | 1 |
| C | 90 | 3 |
可以看到,ROWNUMBER() 给每个产品都分配了唯一的序号,而 RANK() 给价格相同的产品分配了相同的排名。
如何在实际业务场景中使用窗口函数进行数据分析?
窗口函数在数据分析中有很多实际应用场景,例如:
- 计算移动平均值: 比如计算过去7天的销售额的移动平均值,可以平滑数据,更好地观察趋势。
- 计算累计总和: 比如计算每个月的累计销售额,可以了解销售额的增长情况。
- 查找每个类别中的Top N: 比如查找每个地区销售额最高的3个产品。
- 计算百分比排名: 比如计算每个学生的成绩在班级中的百分比排名。
下面是一个计算移动平均值的例子:
SELECT
sale_date,
sale_amount,
*G(sale_amount) OVER (ORDER BY sale_date ASC ROWS BETWEEN 6 PRECEDING AND CURRENT ROW) AS moving_*g
FROM
sales;ROWS BETWEEN 6 PRECEDING AND CURRENT ROW指定了窗口的大小,表示计算当前行和前6行的平均值。这个查询可以帮助你分析销售额的趋势。
再比如,找出每个部门工资最高的员工:
SELECT
department_id,
employee_name,
salary
FROM (
SELECT
department_id,
employee_name,
salary,
RANK() OVER (PARTITION BY department_id ORDER BY salary DESC) AS rank_num
FROM
employees
) AS subquery
WHERE
rank_num = 1;这个例子中,先用窗口函数计算每个员工在部门内的工资排名,然后筛选出排名为1的员工,即工资最高的员工。
窗口函数的功能很强大,掌握了它,可以让你在SQL查询中更加灵活地进行数据分析。
以上就是如何在SQL中使用窗口函数?RANK、ROWNUMBER的应用的详细内容,更多请关注其它相关文章!
# 是在
# 西乡搜索引擎网站优化
# 服装关键词排名团队优化
# 公众号营销推广公司排名
# seo霸屏首 推乐云seo权威
# 企业营销推广攻略大全
# 电商seo使用技巧
# 北京正规seo优化资费
# 关键词seo排名赞赏易 速达
# 金华关键词排名企业
# 西安网站建设免费咨询
# sql语言
# 是一个
# 配了
# 两行
# 如何在
# 行数
# 中有
# 都是
# 平均工资
# 子句
# 区别
相关栏目:
【
科技资讯46185 】
【
网络学院92790 】
相关推荐:
Python字典中优雅地迭代剩余元素的方法
解决Flask中Quill编辑器内容提交失败及TypeError的指南
在J*aScript中复现SciPy的B样条拟合与求值:关键考量
c++如何使用TBB库进行任务并行_c++ Intel线程构建模块
Golang如何优雅处理error_Golang error处理最佳实践总结
在J*a中如何开发简易仓库管理与库存统计_仓库管理库存统计项目实战解析
印象笔记如何设离线包出差查阅_印象笔记设离线包出差查阅【离线阅读】
京东京造J1和网易云音乐氧气真无线有什么不同_国产电商蓝牙耳机音质对比
优化Log4j2控制台输出性能:解决异步日志瓶颈
漫蛙Manwa2官网入口地址分享 漫蛙漫画PC版永久访问通道
想当下一个《2077》?《心之眼》Steam评价升至"多半好评"
抖音从哪里进入网页版_抖音官方入口链接
Win11怎么开启高性能模式_Windows 11电源计划优化设置
163邮箱网页版入口导航平台 163邮箱网页版登录入口官网导航
《明末:渊虚之羽》设计师谈设计角色:那会刚毕业 充满激情
在Go Martini框架中高效服务动态生成图像的实践指南
在Go语言中利用后缀数组处理多字符串:实现高效文本匹配与自动补全
SteamMachine定价或为699美元 大家想入手吗?
小红书怎么解除第三方平台绑定_小红书多平台登录解绑方法介绍
优化HTML表单样式:解决输入框焦点跳动与元素间距问题
最新韩小圈网页版登录入口_官网在线观看官方链接
J*aScript实现单选按钮与关联输入框的联动禁用教程
如何在CSS中使用浮动制作导航栏_float实现水平菜单
c++中的std::launder有什么实际用途_c++对象生命周期与指针优化
Excel组合图表怎么做 Excel创建柱状图与折线组合图教程【图表】
J*aScript动态修改指定div内所有a标签样式指南
腾讯QQ邮箱登录入口_QQ邮箱官方网站使用地址
CSS布局中意外空白:解决padding-top导致的顶部间距问题
outlook中文官网入口地址 outlook官方中文版直达首页链接
Tabulator表格日期时间排序问题及自定义解决方案
mysql备份恢复性能优化_mysql备份恢复性能优化方法
蛙漫2日版入口 WAMAN2(日版)无删减漫画官网链接
LINUX下如何进行磁盘分区_fdisk与parted工具在LINUX中的使用对比
处理Kafka消费者会话超时:深入理解消息处理语义与幂等性
学习通网页版官方登录 超星学习通电脑端入口指南
苹果手机如何防止被恶意App追踪
Win11如何开启讲述人功能 Win11屏幕阅读器(讲述人)开启与关闭【教程】
2025年云电脑操作系统体验 | 无需本地硬件,随时随地使用高性能PC
Centos/Linux 系统下安装 composer 的完整步骤
vivo手机互传视频怎么操作_vivo手机互传视频详细传输方法
React中useState与局部变量:理解组件状态管理与渲染机制
使用 Pandas 高效处理 .dat 文件:数据清洗与数值计算实战
TikTok评论显示延迟如何处理 TikTok评论刷新优化方法
移动端XML文件怎么转换成Excel 手机和平板上的解决方案
c++中为什么推荐使用using替代typedef_c++现代化类型别名
4399体育竞技小游戏_4399小游戏赛事入口
Node.js 中使用 node-cron 实现定时 API 数据抓取与处理
谷歌google账号怎么注册账号 谷歌账号注册官方流程
单12V-2×6实现为RTX 5090供电750W!甚至都没敢跑分
漫蛙网页登录入口 漫蛙漫画官方授权网址


2025-09-06
浏览次数:次
返回列表
C