面试被经常问的SQL窗口函数!

面试被经常问的SQL窗口函数!
最新回答
看不见的坚强

2026-05-25 16:47:03

SQL窗口函数是面试中经常被问到的内容,以下是对窗口函数的详细解答,包括其基本概念、常用函数以及面试中常见问题的解答方法。

一、窗口函数基本概念

窗口函数(Window Function)是SQL中一种特殊的函数,它允许我们在不减少行数的情况下对数据进行聚合、排序和比较等操作。窗口函数通过OVER()子句定义窗口,即函数操作的行集。窗口函数不会将多行合并为一行,而是为每一行返回一个值。

二、常用窗口函数
  1. 排名函数:

    ROW_NUMBER():为窗口内的每一行分配一个唯一的序号,从1开始。

    RANK():为窗口内的行分配排名,相同值的行具有相同的排名,但会跳过后续的序号。

    DENSE_RANK():与RANK()类似,但不会跳过后续的序号。

  2. 聚合函数:

    SUM(), AVG(), COUNT(), MAX(), MIN()等聚合函数也可以作为窗口函数使用,用于计算窗口内的总和、平均值、计数、最大值、最小值等。

  3. 分布函数:

    PERCENT_RANK():计算当前行的相对排名(百分比)。

    CUME_DIST():计算当前行的累积分布(百分比)。

  4. 前后行访问函数:

    LAG():访问当前行之前的行。

    LEAD():访问当前行之后的行。

    FIRST_VALUE():访问窗口内的第一行。

    LAST_VALUE():访问窗口内的最后一行。

三、面试常见问题及解答问题1:求出每个学生成绩最高的三条记录

解答:

SELECT *FROM ( SELECT *, DENSE_RANK() OVER (PARTITION BY 班级id, 学生id ORDER BY 成绩 DESC) AS 顺序 FROM 学生成绩表) t1WHERE 顺序 <= 3;

解释:

  • 使用DENSE_RANK()窗口函数,按班级id和学生id分组,并按成绩降序排序。
  • 通过外层查询筛选出排名前三的记录。
问题2:找出每门课程都高于班级课程平均分的学生

解答:

SELECT 班级id, 学生idFROM ( SELECT t1.班级id, t1.学生id, t1.课程id, t1.成绩, t1.成绩 - t2.课程平均分 AS 相减结果 FROM 学生成绩表 t1 LEFT JOIN ( SELECT 班级id, 课程id, AVG(成绩) AS 课程平均分 FROM 学生成绩表 GROUP BY 班级id, 课程id ) t2 ON t1.班级id = t2.班级id AND t1.课程id = t2.课程id) tmpGROUP BY 班级id, 学生idHAVING MIN(相减结果) > 0;

解释:

  1. 首先计算每门课程在每个班级的平均分。
  2. 将学生成绩表与课程平均分表进行左连接,计算每个学生成绩与对应课程平均分的差值。
  3. 按班级id和学生id分组,筛选出所有课程成绩都高于班级课程平均分的学生(即相减结果的最小值大于0)。
四、总结

窗口函数是SQL中非常强大的工具,能够解决许多复杂的业务问题。在面试中,掌握窗口函数的基本概念、常用函数以及灵活运用它们解决实际问题是非常重要的。通过练习和理解窗口函数的应用场景,可以大大提高SQL查询的能力和效率。