分组排名不用窗口函数?那你还在写几十行的子查询

简介: 窗口函数是SQL进阶关键,助你轻松实现分组排名、累计占比、移动平均等复杂分析。一行代码替代多重子查询,性能更优、逻辑更清。掌握它,告别低效取数,甩开80%同行!

窗口函数:SQL进阶的分水岭,学会它甩开80%的取数员

我是小耶,干运营半路出家的野生DBA——写功课只是为了我踩过的坑,你们别再踩了!

一、没有窗口函数的痛苦回忆

以前想算“每个分类下销售额前3的产品”,没有窗口函数的时候,写法是这样的:

-- 传统写法(不推荐,仅作对比)
SELECT a.product_id, a.category, a.sales, COUNT(*) AS rn
FROM products a
JOIN products b ON a.category = b.category AND a.sales <= b.sales
GROUP BY a.product_id, a.category, a.sales
HAVING COUNT(*) <= 3;

这种写法难以理解、性能差、容易错。窗口函数出现后,一切变得简单。

二、窗口函数一行搞定排名

SELECT product_id, category, sales,
       ROW_NUMBER() OVER (PARTITION BY category ORDER BY sales DESC) AS rn
FROM products;

外层加个 WHERE rn <= 3,查询结束。

语法拆解​:

  • ROW_NUMBER():编号函数
  • OVER:定义窗口
  • PARTITION BY category:按分类分组,每组内独立编号
  • ORDER BY sales DESC:组内按销售额降序排列

三、三个排名函数对比

函数 说明 示例结果(销售额100,90,90,80)
ROW_NUMBER() 唯一编号,不处理并列 1,2,3,4
RANK() 并列跳号 1,2,2,4
DENSE_RANK() 并列不跳号 1,2,2,3

实战选择建议​:

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

四、累计占比(帕累托分析)

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

解释​:

  • SUM(sales) OVER (ORDER BY sales DESC):按销售额降序累计求和
  • SUM(sales) OVER ():全局总和(无PARTITION BY)
  • 两者相除得到累计占比

典型用法​:找到贡献前80%销售额的产品(二八法则)。

五、更多窗口函数实战场景

1. 移动平均(MA3)

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

2. 同比/环比(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 AS growth_rate
FROM daily_sales;

3. 分组内百分比

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

六、性能注意事项

  1. 窗口函数会生成临时表​,如果数据量很大(千万级),注意观察 Created_tmp_disk_tables 状态。
  2. ORDER BY 会排序​,如果窗口内数据不需要排序,可以省略 ORDER BY 提升性能。
  3. 部分窗口函数(如 ​ROW_NUMBER())可以替代 ​LIMIT ​分组取TopN​,比传统子查询快很多。
  4. MySQL 8.0+ 才支持窗口函数​,低版本需要升级或者用变通写法。

七、快速记忆口诀

分组排名用窗口,
PARTITION 分组,ORDER 排序,
三个函数看需求,
累计移动都能算。

八、实战练习建议

找一份订单表,自己尝试:

  • 每个用户最近3笔订单
  • 每月销售额环比增长率
  • 每个商品在所属分类中的销售额百分位

推荐刷题网站​:LeetCode 窗口函数专题(难度 中等 ~ 困难)

小耶在手,SQL不愁。

你工作中用到窗口函数最多的场景是什么?评论区分享一下,给新手一些灵感。

相关文章
|
4月前
|
人工智能 机器人 测试技术
从成功率到能力画像:上海AI Lab推出具身操作仿真评测基座EBench
上海AI Lab推出EBench,突破单一成功率评测范式,构建可复现、可拆解的具身操作能力诊断框架。涵盖26类任务、5维能力标签与4类泛化测试,共794条用例,助力精准刻画模型强项、短板及真实泛化性。
373 2
|
4月前
|
人工智能 并行计算 调度
ZStack dGPU:让虚拟机里的 GPU 也能按需切分
ZStack dGPU 是面向虚拟机的纯软件GPU动态切分方案,无需NVIDIA vGPU授权或MIG硬件限制,支持主流NVIDIA GPU。实现显存与算力按需分配、即时回收,推理性能损耗仅约7%,23.5小时零故障运行。补齐IaaS层GPU细粒度调度能力,提升私有云GPU利用率。(239字)
|
4月前
|
SQL 数据库 数据库管理
写完SQL先别跑,这两步能救你一晚
我是小耶,专注踩坑与填坑,今天分享SQL性能关键:数据库执行顺序(FROM→WHERE→…)与人脑思维的错位——切忌先JOIN后过滤!用实例对比,教你“过滤前置”提速技巧。养成自查习惯,SQL轻松快一倍!
|
4月前
|
SQL 人工智能 安全
AI圈开始“养马”了?聊聊龙虾退位、爱马仕登基
AI智能体“龙虾”(OpenClaw)的衰落与“爱马仕”(Hermes Agent)的崛起:前者因API限策与高危漏洞(CVSS 9.9)式微;后者以持久记忆、技能自生成、跨平台互通等实用能力破圈,成技术圈新“拐杖”。但技术无银弹,懂你的工具才是真助力。
|
26天前
|
存储 人工智能 关系型数据库
湖库一体:2026年数据库架构的“终极答案”还是新瓶装旧酒?
2026年6月,OceanBase发布湖库一体AI数据库,阿里云PolarDB年初已推出AI数据湖库(Lakebase),Databricks也在6月推出了LTAP架构。“湖库一体”成为2026年数据库圈最热的概念之一。本文从湖库一体的概念定义出发,拆解其技术原理,对比“湖仓一体”与“湖库一体”的差异,分析三大厂商的落地路径,并讨论这一趋势对DBA和架构师的现实意义。
|
2月前
|
SQL 人工智能 自然语言处理
Vibe Coding 是什么?当“感觉编程”遇上数据库
Vibe Coding是2026年编程圈最火的概念之一,指开发者通过自然语言描述“感觉”或“意图”,由AI自动生成代码、调试、优化。本文从Vibe Coding的起源讲起,分析它如何改变数据库开发方式:从手写SQL到自然语言查询、从人工调索引到AI推荐、从经验运维到智能诊断。探讨这项趋势对DBA职业的影响,并给出拥抱变化的实用建议。技术会变,但人的判断力、审美和业务理解才是长期竞争力。
|
2月前
|
SQL 存储 关系型数据库
覆盖索引:让你的查询直接从索引返回,彻底告别回表
覆盖索引是SQL优化中性价比较高的技巧,让查询直接从索引返回所需列,避免回表操作。本文解释覆盖索引的原理,通过EXPLAIN的“Using index”判断是否生效。结合复合索引设计、深分页优化(延迟关联)等场景,给出覆盖索引的使用方法和注意事项。用好覆盖索引,不改SQL逻辑,仅调整索引设计即可显著提升查询性能。
|
4月前
|
人工智能 运维 算法
AI Agent落地卡壳:不是大脑不够强,是环境太陌生?
某头部互联网公司AI Agent任务成功率不足30%,暴露“眼高手低”通病:大模型有“大脑”,却缺“四肢”。JBoltAI首创AI-Ready执行环境(AREE),从Java资产感知、确定性协议、事件驱动编排等五维重构智能体执行能力,显著提升效率与可靠性,推动AI从“能想”走向“会做”。
155 1
|
2月前
|
SQL 监控 数据挖掘
窗口函数进阶:排名、累计、移动平均一网打尽
本篇干货分享SQL窗口函数实战:一行代码轻松搞定分组取前三、累计占比、移动平均、同比环比等高频需求,告别冗长易错的子查询。涵盖ROW_NUMBER/RANK/DENSE_RANK、LAG/LEAD、分区排序与性能优化要点,助你高效进阶数据分析!
|
5天前
|
SQL Oracle 关系型数据库
开发者自主授权全解析:从社区版到常青藤计划,数据库选型新思路
数据库License曾经是开发者最头疼的事情之一——按核数收费、按节点数收费、按CPU收费,起步就是几十万。2026年,开发者自主授权正在改变这一切。本文从开发者自主授权的概念出发,对比传统商业授权与开源/自主授权的差异,拆解长期免费授权模式如何降低开发者的试错成本,帮助读者理解开发者自主授权如何让数据库“用得起的”成为现实。