发布时间:2024-07-19 10:01
窗口函数,是一种分析型的OLAP函数,OLAP是 online analytical processing 的简称,意思是对数据库数据进行实时分析处理。而且面试过程中出现的频率非常高,几乎是大厂的 面试必考题。
窗口函数是比较之前的内容较为难懂一点,是属于高阶知识,一般这个窗口函数会放在select语句中。
基本语法:
<窗口函数> OVER (
PARTITION BY <用于分组的列名> --可选
ORDER BY <用于排序的列名> --可选
)
上面的 <窗口函数> 这个位置可以放下面两种函数:
一般这个窗口函数会放在select语句中
1.聚合函数
实例1:在成绩表中,找到Sid为7-10的学生,并计算了每个学生的总分,并且总分按照正序显示出来。
select
Sid as \'学生编号\',
sum(score) as \'总分\'
from scores
where Sid BETWEEN 6 AND 11
GROUP BY Sid
ORDER BY sum(score)
如上我们知道了学生的总分,但是我还想知道学生的每科成绩的分数,怎么办?
select
Sid as \'学生编号\',
Cid as \'科目编号\',
score as \'学生各科成绩\',
sum(score) as \'总分\'
from scores
where Sid BETWEEN 6 AND 11
GROUP BY Sid,Cid,score
实例2:
select
Sid as \'学生编号\',
Cid as \'科目编号\',
score as \'学生各科成绩\',
sum(score) OVER (PARTITION BY Sid) as \'总分\'
from scores
where Sid between 6 and 11
group by Sid,Cid,score
order by sum(score)
select
Sid as \'学生编号\',
Cid as \'科目编号\',
score as \'学生各科成绩\',
sum(score) OVER () as \'总分\'
from scores
where Sid between 6 and 11
group by Sid,Cid,score
order by sum(score)
2.专用窗口函数
常用的专用窗口函数有:
(1)获取数据排名
实例3:在成绩表中,找出Sid为6-11的学生,并计算成绩从高到低的排名
select *,
ROW_NUMBER() OVER (
order by score
) as \'成绩排名\'
from scores
where Sid between 6 and 11;
如果将 ROW_NUMBER() 替换成 RANK(),返回结果是这样的:
(2)获取第一名或者最后一名
实例4:在成绩表中,找到Sid为6-11的学生, 获取每个学生的最高成绩
select *,
FIRST_VALUE(score) OVER (
PARTITION BY Sid
ORDER BY score DESC
) as \'最高成绩\'
from scores
where Sid between 6 and 11
(3)偏移函数
实例5:获取下面第2行偏移分数
select *,
LEAD(score,2) OVER (ORDER BY Sid DESC) as \'获取下面第2行score值\'
from scores
where Sid between 7 and 9
(4)分布函数