新闻中心

如何在SQL中使用窗口函数?RANK、ROWNUMBER的应用

2025-09-06
浏览次数:
返回列表
窗口函数在保留原行数基础上添加统计结果,如RANK和ROWNUMBER用于排序,前者对相同值并列排名并跳号,后者连续编号;与GROUP BY不同,窗口函数不减少行数,可同时显示明细与聚合数据,适用于移动平均、累计求和、Top N查询等场景。

如何在sql中使用窗口函数?rank、rownumber的应用

窗口函数,说白了,就是在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 Krisp

AI噪音消除工具

Krisp 135 查看详情 Krisp
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!甚至都没敢跑分  漫蛙网页登录入口 漫蛙漫画官方授权网址 

搜索