当前位置: 首页 > news >正文

面试常考的 SQL 窗口函数汇总

面试常考的 SQL 窗口函数汇总(举例详解)

SQL 窗口函数是数据分析、数据工程师岗位面试中的高频考点。掌握它们不仅能提升 SQL 编写能力,还能在面试中展示出对数据处理的深入理解。下面是面试中最常考的窗口函数,结合典型例题和详细解析,助你轻松应对。

一、窗口函数基础语法

函数名() OVER ([PARTITION BY1,2, ...][ORDER BY1 [ASC|DESC], ...][ROWS/RANGE BETWEEN ...]
)
  • PARTITION BY:分组,类似 GROUP BY,但不合并行。
  • ORDER BY:排序,决定窗口函数计算的顺序。
  • ROWS/RANGE:定义窗口的“范围”,如当前行前后几行。

二、面试常考窗口函数及示例

1. RANK()

功能:排名,相同值并列,后续排名跳过。
例题:按成绩排名,相同分数并列,后续名次跳过。

SELECT name,score,RANK() OVER (ORDER BY score DESC) AS rank_score
FROM students;

结果示例

namescorerank_score
A1001
B1001
C903
D804

说明:A 和 B 并列第 1,C 跳过 2,直接为 3。


2. DENSE_RANK()

功能:排名,相同值并列,后续名次不跳过。
例题:按成绩排名,相同分数并列,后续名次连续。

SELECT name,score,DENSE_RANK() OVER (ORDER BY score DESC) AS dense_rank_score
FROM students;

结果示例

namescoredense_rank_score
A1001
B1001
C902
D803

说明:A 和 B 并列第 1,C 为 2,不跳过。


3. ROW_NUMBER()

功能:生成唯一行号,不考虑相同值。
例题:按成绩排序,生成唯一序号。

SELECT name,score,ROW_NUMBER() OVER (ORDER BY score DESC) AS row_num
FROM students;

结果示例

namescorerow_num
A1001
B1002
C903
D804

说明:即使分数相同,行号也唯一。


4. NTILE(n)

功能:将数据分成 n 组,每组分配一个编号。
例题:将学生按成绩分成 3 组。

SELECT name,score,NTILE(3) OVER (ORDER BY score DESC) AS ntile_group
FROM students;

结果示例

namescorentile_group
A1001
B1001
C902
D803

说明:数据被均匀分成 3 组。


5. LAG() / LEAD()

功能

  • LAG(col):获取当前行的前一行值。
  • LEAD(col):获取当前行的后一行值。
    例题:查询每个学生的前一名和后一名的成绩。
SELECT name,score,LAG(score, 1) OVER (ORDER BY score DESC) AS prev_score,LEAD(score, 1) OVER (ORDER BY score DESC) AS next_score
FROM students;

结果示例

namescoreprev_scorenext_score
A100NULL100
B10010090
C9010080
D8090NULL

说明:LAG 和 LEAD 分别获取前后行的值,用于同比、环比分析。


6. SUM() OVER()

功能:计算累计和。
例题:按成绩顺序计算累计总分。

SELECT name,score,SUM(score) OVER (ORDER BY score DESC) AS cum_sum
FROM students;

结果示例

namescorecum_sum
A100100
B100200
C90290
D80370

说明:按成绩降序计算累计和。


7. AVG() OVER()

功能:计算移动平均值。
例题:计算当前行及前一行的平均成绩。

SELECT name,score,AVG(score) OVER (ORDER BY score DESC ROWS BETWEEN 1 PRECEDING AND CURRENT ROW) AS moving_avg
FROM students;

结果示例

namescoremoving_avg
A100100
B100100
C9095
D8085

说明:窗口范围为当前行及前一行。


三、面试中常考的窗口函数题目类型

  1. 排名类:RANK、DENSE_RANK、ROW_NUMBER 的区别。
  2. 分组分桶:NTILE 分组统计。
  3. 同比环比:LAG、LEAD 获取前后行数据。
  4. 累计统计:SUM、AVG 等聚合函数与 OVER 结合。
  5. 移动窗口:ROWS/RANGE 定义窗口范围。

四、总结

函数名功能面试考点
RANK()排名,跳过后续名次与 DENSE_RANK、ROW_NUMBER 区别
DENSE_RANK()排名,不跳过后续名次同上
ROW_NUMBER()唯一行号去重、分页
NTILE(n)分组编号分桶、分群
LAG()/LEAD()前后行取值同比、环比分析
SUM()/AVG() OVER()累计/移动统计累计和、移动平均

如果你有具体的面试题或数据表结构,我可以帮你定制更详细的解答和优化建议!欢迎继续提问。


以上内容由AI生成,仅供参考和借鉴

http://www.dtcms.com/a/341095.html

相关文章:

  • 【Tech Arch】Apache Pig大数据处理的高效利器
  • 深入理解数据结构:从数组、链表到B树家族
  • 数据结构:利用旋转在AVL树中维持平衡(Inserting in AVL with Rotation)
  • FastAPI初学
  • PyTorch API 1
  • 新能源知识库(81)新能源半实物仿真平台介绍
  • C/C++ Linux系统编程:详解常见的系统调用函数,文件I/O核心:open, close, read, write
  • 【C++】基础:C++11-14-17常用新特性介绍
  • 计算机网络技术-局域网配置(Day.4)
  • 微信小程序授权登录+JWT
  • shell间接引用
  • CVE-2018-12613 漏洞复现
  • 为什么我的UI界面会突然卡顿,失去响应
  • FLASK项目快速构建
  • 用TestComplete打造高效CI/CD测试流程
  • nodejs mongodb基础
  • 【论文阅读】-《SIGN-OPT: A QUERY-EFFICIENT HARD-LABEL ADVERSARIAL ATTACK》
  • Gitea Webhook教程:实现git push后自动部署更新网站 (CI/CD入门)
  • 7.2 Linux:驱动开发——模块机制
  • 7.3 Linux:驱动开发——应用程序和驱动程序的交互
  • imx6ull-驱动开发篇30——Linux 非阻塞IO实验
  • 电商平台商品详情数据爬取教程​
  • JS原型链
  • 第10课_Rust网络编程
  • TrustZone 版的按键点灯程序下载调试 LAT1492
  • 迅为RK3562开发板Android修改uboot logo
  • element UI 和 element plus 在组件上有哪些不同
  • 《算法导论》第 35 章-近似算法
  • 《设计模式之禅》笔记摘录 - 17.模板方法模式
  • hot100 之160-相交链表(双指针切换)