news 2026/4/23 13:02:04

面试官:ROW_NUMBER() 和 GROUP BY 到底差在哪?5 分钟彻底秒杀!

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
面试官:ROW_NUMBER() 和 GROUP BY 到底差在哪?5 分钟彻底秒杀!


【SQL 必知必会】一文吃透 ROW_NUMBER() OVER(PARTITION BY …) 与 GROUP BY 的本质区别


关键词:窗口函数、ROW_NUMBER、PARTITION BY、GROUP BY、SQL 优化、MySQL8、PostgreSQL、面试题
1. 前言
面试里高频出现的一道题:
“ROW_NUMBER() OVER (PARTITION BY no ORDER BY cIt DESC) 到底是哪个数据库的语法?和 GROUP BY 有什么区别?”
90% 的同学只能答出“分组排序”,却说不清“为啥不用 GROUP BY 也能分组”。

今天 5 分钟带你彻底搞懂!
2. 语法速览
ROW_NUMBER() OVER (
PARTITION BY 列1, 列2 -- 分组
ORDER BY 列3 [ASC|DESC] -- 组内排序
) AS 别名
• SQL 标准函数,MySQL8.0+、PostgreSQL、SQL Server、Oracle、SQLite3.25+ 全支持。
• 不是“某个数据库专用”! 别再被面试官套路。
3. 核心区别一张表
维度 GROUP BY ROW_NUMBER() OVER(PARTITION BY …)
是否聚合 ✅ 每组只返回 1 行 ❌ 不聚合,原行数不变
能否选原列 ❌ 只能 SELECT 聚合列/聚合函数 ✅ 任意列都能选
执行顺序 先 WHERE → 再 GROUP → 再 HAVING 先 FROM → 再 WINDOW → 再 WHERE(窗口函数在 WHERE 之后)
典型场景 统计每组总数、平均值 取每组 TopN、去重最新记录
4. 实战:取每个用户最新订单
表结构
orders(
id bigint,
user_id int,
amount decimal(10,2),
create_time datetime
);
需求:拿到每个用户最新一笔订单的完整字段。
用 GROUP BY 几乎写不出来(除非子查询嵌套),用窗口函数 1 行搞定:
SELECT *
FROM (
SELECT *,
ROW_NUMBER() OVER (PARTITION BY user_id ORDER BY create_time DESC) AS rn
FROM orders
) t
WHERE rn = 1;
• 性能:给 (user_id, create_time) 建联合索引即可走覆盖索引,O(n) 级别。
• 扩展:想取“最新 3 笔”把 rn = 1 换成 rn <= 3 即可。
5. 常见坑
1. MySQL5.7 及以下不支持窗口函数,会报 ERROR 1064。
2. WHERE 里不能直接引用窗口列别名,需要在外层包一层子查询。
3. 与 GROUP BY 混用时要记住:窗口函数在 GROUP BY 之后执行,可以引用聚合结果。
SELECT user_id,
SUM(amount) AS total_amt,
ROW_NUMBER() OVER (ORDER BY SUM(amount) DESC) AS amt_rank
FROM orders
GROUP BY user_id;
4. 面试金句
“GROUP BY 是‘压缩’数据,窗口函数是‘透视’数据,二者根本不在一个维度工作。”
5. 结语
记住:
• 见到“每组 TopN、最新、去重” 先想窗口函数;
• 见到“每组统计、求和、求平均” 再用 GROUP BY。
收藏+点赞,下次面试不迷路!
----

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/23 12:19:25

没Linux基础能用Z-Image?Windows友好云端方案来了

没Linux基础能用Z-Image&#xff1f;Windows友好云端方案来了 引言&#xff1a;为什么Windows用户需要这个方案 如果你是一位Windows用户&#xff0c;最近被GitHub上热门的Z-Image项目吸引&#xff0c;却因为满屏的Linux命令望而却步&#xff0c;这篇文章就是为你准备的。Z-I…

作者头像 李华
网站建设 2026/4/23 12:22:12

17个关键点检测详解:MediaPipe云端部署,避开85%新手错误

17个关键点检测详解&#xff1a;MediaPipe云端部署&#xff0c;避开85%新手错误 引言&#xff1a;为什么选择MediaPipe做姿态估计&#xff1f; 作为一名转行CV的Java工程师&#xff0c;你可能在面试中被问到姿态估计相关的问题。本地环境配置复杂、依赖冲突等问题常常让新手束…

作者头像 李华
网站建设 2026/4/19 7:15:00

ComfyUI插件全预装:Z-Image云端环境开箱即用

ComfyUI插件全预装&#xff1a;Z-Image云端环境开箱即用 引言 作为一名AI图像生成领域的研究者&#xff0c;你是否经常遇到这样的困扰&#xff1a;想要测试Z-Image模型与各种ControlNet插件的配合效果&#xff0c;却在本地安装过程中不断遭遇插件冲突、环境配置错误等问题&am…

作者头像 李华
网站建设 2026/4/23 12:19:09

vivado hls设计总结(二十一)

一、协议接口 ap_none,可以实现输入参数任意时刻的写入和读取 ap_stable&#xff0c;无协议&#xff0c;复位之后数据保持稳定&#xff0c;也就是两次复位之间数据保持不变 ap_vld接口&#xff0c;实现validdata绑定的接口&#xff0c;提供数据的有效信号&#xff0c;用于读取和…

作者头像 李华
网站建设 2026/4/23 12:24:06

掌握C++26任务调度核心,3步实现零延迟异步处理

第一章&#xff1a;C26异步编程的演进与std::execution的诞生C26标志着异步编程模型的一次重大飞跃&#xff0c;其核心变革体现在引入统一的执行抽象——std::execution。这一特性的诞生源于长期以来对并发与并行操作表达能力不足的反思&#xff0c;旨在为算法、任务调度和异步…

作者头像 李华
网站建设 2026/4/23 12:20:53

没显卡怎么做姿态估计?人体关键点检测云端方案2元起

没显卡怎么做姿态估计&#xff1f;人体关键点检测云端方案2元起 1. 为什么你需要云端姿态估计方案 最近抖音上各种AI体态分析视频火了&#xff0c;作为健身教练的你肯定也注意到了。这些工具能精准识别学员的关节角度、脊柱曲度甚至肌肉发力模式&#xff0c;简直是私教课的神…

作者头像 李华