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

简介: 窗口函数是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月前
|
SQL 人工智能 自然语言处理
Vibe Coding 是什么?当“感觉编程”遇上数据库
Vibe Coding是2026年编程圈最火的概念之一,指开发者通过自然语言描述“感觉”或“意图”,由AI自动生成代码、调试、优化。本文从Vibe Coding的起源讲起,分析它如何改变数据库开发方式:从手写SQL到自然语言查询、从人工调索引到AI推荐、从经验运维到智能诊断。探讨这项趋势对DBA职业的影响,并给出拥抱变化的实用建议。技术会变,但人的判断力、审美和业务理解才是长期竞争力。
|
1月前
|
存储 SQL 容灾
共享存储集群 vs 分布式多副本:同城双活两条技术路线怎么选?
同城双活正在成为金融、政务等核心系统的容灾标配——RPO=0、RTO<30秒。但真正的落地远不止“两个机房各放一套数据库”那么简单。网络延迟的容忍度、脑裂预防机制、同步复制的性能代价、以及故障切换后的数据回滚,每一个环节都可能成为“最后一公里”的绊脚石。本文从容灾架构演进入手,拆解同城双活的核心技术原理、关键挑战与应对方案,并结合同城双中心方案及实测数据进行深度解析。
|
6月前
|
人工智能 机器人 测试技术
从成功率到能力画像:上海AI Lab推出具身操作仿真评测基座EBench
上海AI Lab推出EBench,突破单一成功率评测范式,构建可复现、可拆解的具身操作能力诊断框架。涵盖26类任务、5维能力标签与4类泛化测试,共794条用例,助力精准刻画模型强项、短板及真实泛化性。
515 2
|
6月前
|
人工智能 并行计算 调度
ZStack dGPU:让虚拟机里的 GPU 也能按需切分
ZStack dGPU 是面向虚拟机的纯软件GPU动态切分方案,无需NVIDIA vGPU授权或MIG硬件限制,支持主流NVIDIA GPU。实现显存与算力按需分配、即时回收,推理性能损耗仅约7%,23.5小时零故障运行。补齐IaaS层GPU细粒度调度能力,提升私有云GPU利用率。(239字)
|
6月前
|
SQL 安全 网络协议
应急响应:勒索软件攻击源IP分析,如何通过IP地址查询定位辅助溯源?
本文聚焦勒索软件应急响应中的IP溯源实战,详解如何从日志提取攻击IP、定性识别代理/跳板、关联C2基础设施,并强调离线IP库在断网取证与合规审计中的关键价值,助力企业从“删病毒”迈向“堵源头”的闭环处置。
应急响应:勒索软件攻击源IP分析,如何通过IP地址查询定位辅助溯源?
|
6月前
|
存储 JSON 算法
京东商品 SKU 信息接口技术干货:数据拉取、规格解析与字段治理(附踩坑总结 + 可运行代码
本文详解京东SKU接口对接核心技术:涵盖高精度参数校验(如SKU ID纯数字、时间戳格式)、权限申请要点(认证材料、用途合规说明)、MD5签名生成(空值过滤、ASCII排序)、规格编码解析与区域库存处理,并总结7类高频坑及解决方案,附可直接运行的Python客户端代码。
|
6月前
|
人工智能 自然语言处理 安全
Claude Code Routines:给你的代码装上“自动巡航“
Routines 是 Claude 的可编程自动化代理,支持定时、API 和 GitHub webhook 三种触发方式,将重复开发任务(如修 Bug、更新文档、安全审查)转为 AI 驱动的云端流水线,解放开发者专注高价值工作。
665 1
|
6月前
|
Windows Python
SBTI 人格测试人一多网站就崩?试试这个本机就能轻松下载的 SBTI 测试
SBTI人格测试火爆致官网崩坏?这款Windows桌面版解压即用,离线答题不卡顿、不抢带宽,支持单机多测、随时分享。源自开源项目,尊重原作者,GitHub可下载或联系作者秒发包。(239字)
1955 11
|
6月前
|
人工智能 IDE 测试技术
AI Agent下半场:比模型更卷的是Skill生态
2026年,大模型正从“技术壁垒”变为“基础设施”,竞争焦点转向Agent落地能力。MCP协议已成事实标准,月下载9700万次;Skill生态则将测试、开发等经验工程化封装,实现能力复用与可持续演进——真正的分水岭,不在模型,而在如何让AI把事干成。
|
6月前
|
存储 人工智能 搜索推荐
AI英语学习APP的开发
国内AI英语学习APP正迈向“情感陪伴+超个性化”新阶段。2026年用户期待AI懂业务、有共情、精纠错。建议:构建沉浸式场景对话闭环;采用国产大模型+RAG+音素级纠音技术;严守算法、教育、内容安全三重合规;聚焦职业考证/低龄/银发等垂直赛道突围。(239字)