2026-05-25 16:47:03
SQL窗口函数是面试中经常被问到的内容,以下是对窗口函数的详细解答,包括其基本概念、常用函数以及面试中常见问题的解答方法。
一、窗口函数基本概念窗口函数(Window Function)是SQL中一种特殊的函数,它允许我们在不减少行数的情况下对数据进行聚合、排序和比较等操作。窗口函数通过OVER()子句定义窗口,即函数操作的行集。窗口函数不会将多行合并为一行,而是为每一行返回一个值。
二、常用窗口函数排名函数:
ROW_NUMBER():为窗口内的每一行分配一个唯一的序号,从1开始。
RANK():为窗口内的行分配排名,相同值的行具有相同的排名,但会跳过后续的序号。
DENSE_RANK():与RANK()类似,但不会跳过后续的序号。
聚合函数:
SUM(), AVG(), COUNT(), MAX(), MIN()等聚合函数也可以作为窗口函数使用,用于计算窗口内的总和、平均值、计数、最大值、最小值等。
分布函数:
PERCENT_RANK():计算当前行的相对排名(百分比)。
CUME_DIST():计算当前行的累积分布(百分比)。
前后行访问函数:
LAG():访问当前行之前的行。
LEAD():访问当前行之后的行。
FIRST_VALUE():访问窗口内的第一行。
LAST_VALUE():访问窗口内的最后一行。
解答:
SELECT *FROM ( SELECT *, DENSE_RANK() OVER (PARTITION BY 班级id, 学生id ORDER BY 成绩 DESC) AS 顺序 FROM 学生成绩表) t1WHERE 顺序 <= 3;解释:
解答:
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;解释:
窗口函数是SQL中非常强大的工具,能够解决许多复杂的业务问题。在面试中,掌握窗口函数的基本概念、常用函数以及灵活运用它们解决实际问题是非常重要的。通过练习和理解窗口函数的应用场景,可以大大提高SQL查询的能力和效率。