Thanks to visit codestin.com
Credit goes to developer.aliyun.com

窗口函数进阶:排名、累计、移动平均一网打尽

本文涉及的产品
RDS MySQL DuckDB 分析主实例,基础系列 4核8GB
RDS MySQL DuckDB 分析主实例,集群系列 4核8GB
PolarDB Agent Express,2核4GB
简介: 本篇干货分享SQL窗口函数实战:一行代码轻松搞定分组取前三、累计占比、移动平均、同比环比等高频需求,告别冗长易错的子查询。涵盖ROW_NUMBER/RANK/DENSE_RANK、LAG/LEAD、分区排序与性能优化要点,助你高效进阶数据分析!

大家好,我是小耶,写功课只是为了我踩过的坑,你们别再踩了!

很多数据分析师朋友问我:分组取前三、算累计占比、做移动平均,以前用子查询和自连接写几十行还容易错,有没有更简单的方法?有,窗口函数一行搞定。

1 名词解释

  • 窗口函数:在一组与当前行相关的行(窗口)上执行计算,不合并行,保留原数据。
  • 分区(PARTITION BY):将数据分组,窗口函数在每个分组内独立计算。
  • 排序(ORDER BY):定义窗口内行的顺序,影响排名、累计等函数的计算结果。
  • 框架(ROWS/RANGE):定义窗口的边界,如 ROWS BETWEEN 2 PRECEDING AND CURRENT ROW

2 实际运用

2.1 三种排名函数

SELECT 
    product_id, category, sales,
    ROW_NUMBER() OVER (PARTITION BY category ORDER BY sales DESC) AS rn,
    RANK()       OVER (PARTITION BY category ORDER BY sales DESC) AS rk,
    DENSE_RANK() OVER (PARTITION BY category ORDER BY sales DESC) AS dr
FROM products;
函数 行为 示例(销售额:100,90,90,80)
ROW_NUMBER() 唯一编号,不处理并列 1,2,3,4
RANK() 并列跳号 1,2,2,4
DENSE_RANK() 并列不跳号 1,2,2,3


适用场景​:

  • 分页取数据 → ROW_NUMBER()
  • 比赛排名(允许并列但跳过名次) → RANK()
  • 工资等级(并列不跳过) → DENSE_RANK()

2.2 累计和与累计占比(帕累托分析)

SELECT 
    product, sales,
    SUM(sales) OVER (ORDER BY sales DESC) AS running_total,
    SUM(sales) OVER (ORDER BY sales DESC) / SUM(sales) OVER () AS cum_pct
FROM products;

2.3 移动平均(MA3)

SELECT 
    date, sales,
    AVG(sales) OVER (ORDER BY date ROWS BETWEEN 2 PRECEDING AND CURRENT ROW) AS ma3
FROM daily_sales;

2.4 同比/环比(LAG / LEAD)

SELECT 
    date, sales,
    LAG(sales, 1) OVER (ORDER BY date) AS prev_day_sales,
    (sales / LAG(sales, 1) OVER (ORDER BY date) - 1) * 100 AS growth_rate
FROM daily_sales;

2.5 分组内百分比

SELECT 
    category, product, sales,
    sales / SUM(sales) OVER (PARTITION BY category) AS pct_in_category
FROM products;

3 性能注意事项

  • 窗口函数会在内存或磁盘中创建临时表,大量数据时注意监控 Created_tmp_disk_tables 状态。
  • ORDER BY 会触发排序,如果窗口内不需要排序可以省略 ORDER BY 提升性能。
  • MySQL 8.0及以上才支持窗口函数,低版本需要升级或用替代写法。

4 价值总结

  • 学会窗口函数,你可以将几十行的子查询+自连接改写为一行,代码简洁且性能更优。
  • 窗口函数能解决数据分析中的大部分分组统计、排名、累计计算需求,是SQL进阶的里程碑。
  • 建议先从 ROW_NUMBER() 和 SUM() OVER() 入手,再逐步掌握 RANK()、LAG() 等高级函数。

小耶在手,SQL不愁。

还有什么想了解的,欢迎留言!小耶一定知无不言言无不尽……我们下次见~

相关文章
|
1月前
|
SQL 人工智能 安全
AI圈开始“养马”了?聊聊龙虾退位、爱马仕登基
AI智能体“龙虾”(OpenClaw)的衰落与“爱马仕”(Hermes Agent)的崛起:前者因API限策与高危漏洞(CVSS 9.9)式微;后者以持久记忆、技能自生成、跨平台互通等实用能力破圈,成技术圈新“拐杖”。但技术无银弹,懂你的工具才是真助力。
|
算法 关系型数据库 数据库
德哥的PostgreSQL私房菜 - 史上最屌PG资料合集
看完并理解这些文章,相信你会和我一样爱上PostgreSQL,并成为PostgreSQL的布道者。 沉稳的外表无法掩饰PG炙热的内心 。 扩展阅读,用心感受PostgreSQL 内核扩展 《找对业务G点, 体验酸爽 - PostgreSQL内核扩展指南》https://yq.
59832 152
|
2天前
|
并行计算 API 开发者
万字详解:普通开发者如何用Ollama、llama.cpp把大模型无缝跑在本地消费级显卡上?
本文详解普通开发者如何用Ollama与llama.cpp,将7B–14B大模型高效部署于本地消费级显卡(如RTX 4060 8GB)。涵盖显存评估、量化原理(Q4_K_M等)、一键运行与精细调优、避坑指南及跨平台(CUDA/ROCm/Metal)实测数据,助你零成本、高隐私、离线可用。
|
2天前
|
人工智能 JavaScript API
2026hermes agent 实操安装教程|自建自主进化 AI 助手
Hermes Agent是由Nous Research开发的开源智能体(MIT协议),2026年2月发布v0.13.0版。主打自主进化、越用越强,支持任务归档、检索+大模型双驱动、多工具集成、子智能体并行及全平台一键部署,适配Kimi等主流模型,助力个人与企业高效办公。
|
2天前
|
人工智能 安全 Shell
Harness Engineering 被讲烂之后,Agent 工程真正难的是什么?
看 Anthropic、OpenAI、Gemini 的 Harness 都在做啥?
|
2天前
|
人工智能
阿里云ai模型Token活动手动整理:免费领百炼Tokens、CodingPlan、TokenPlan及节省计划活动
2026年阿里云AI大模型Token五大优惠:开通百炼即领7000万Tokens(每模型100万,有效期90天);Coding Plan Pro版200元/月限量抢购;Token Plan团队版198元起免抢直购;AI节省计划最高5.3折;按量付费满200元返200元。
108 1
|
2天前
|
人工智能 自然语言处理 供应链
|
2天前
|
人工智能 自然语言处理 安全
Claude Code 全攻略:命令大全+三种模式+记忆体系+实战工作流完整手册
Claude Code 是当前最流行的终端级 AI 编程助手,能够直接在命令行中完成代码生成、项目理解、文件修改、命令执行、错误修复等全流程开发工作。它不依赖图形界面、不占用额外资源,却能深度理解项目结构,自动生成规范代码,大幅提升研发效率。
713 2
|
2天前
|
缓存 JSON API
你的笔记已经在本地了,为什么导出还要绕一圈?!
有时候最别扭的地方就在这里:笔记明明已经同步到你的电脑里了,你只是想把它导出来,却还是要先登录账号、确认同步、找导出入口、看格式能不能被下一个工具识别。
|
2天前
|
人工智能 缓存 自然语言处理
阿里云AI模型节省计划是什么?优势及优惠折扣有哪些?购买及使用指引
阿里云百炼推出AI大模型节省计划,含通用型(最高5.3折、覆盖全部直供模型)、专用型(图像/语音/向量等)及资源包三类方案,支持多地域、自动抵扣,助力企业降本增效。阿里云百炼AI大模型官网:https://t.aliyun.com/U/fPVHqY