开窗函数

来源:http://www.sh-fengwen.com 作者:气血双补 人气:84 发布时间:2019-09-03
摘要:一个学习性任务:每个人有不同次数的成绩,统计出每个人的最高成绩。 1.创建测试表score 这个问题应该还是相对简单,其实就用聚合函数就好了。 create table score(class_no varchar2(10), --班

一个学习性任务:每个人有不同次数的成绩,统计出每个人的最高成绩。

1.创建测试表score

这个问题应该还是相对简单,其实就用聚合函数就好了。

create table score(
class_no varchar2(10),      --班级
student_name varchar2(20),  --姓名
score number                --分数
);

select id,name,max(score) from Student group by id,name order by name

2.初始化数据

上边这种情况只适用id 和name是一一对应的,否则查询出来的数据是不正确的。

insert into score(class_no,student_name,score) values('n001','park',99);
insert into score(class_no,student_name,score) values('n001','ning',99);
insert into score(class_no,student_name,score) values('n001','tom',79);
insert into score(class_no,student_name,score) values('n001','cat',87);
insert into score(class_no,student_name,score) values('n001','sandy',95);
insert into score(class_no,student_name,score) values('n002','cake',85);
insert into score(class_no,student_name,score) values('n002','mavom',69);
insert into score(class_no,student_name,score) values('n002','tony',90);
insert into score(class_no,student_name,score) values('n002','lisa',99);
insert into score(class_no,student_name,score) values('n002','linda',67);
insert into score(class_no,student_name,score) values('n003','versy',84);
insert into score(class_no,student_name,score) values('n003','peter',97);
insert into score(class_no,student_name,score) values('n003','train',83);
insert into score(class_no,student_name,score) values('n003','rain',80);

例如 : 1 张三 100

3.将不同班级学生按分数降序排列

           2 张三 90

select *
  from (select class_no,
               student_name,
               score,
               rank() over(partition by class_no order by score desc)
          from score) t;

          查询出来的结果

4.执行结果

          两条信息都会输出。

图片 1

避免这种情况,可以使用开窗函数。

5.其他分析函数

个人理解就是,开窗函数和聚合函数功能是相反的。

row_number() over(partition by ... order by ...)
rank() over(partition by ... order by ...)
dense_rank() over(partition by ... order by ...)
count() over(partition by ... order by ...)
max() over(partition by ... order by ...)
min() over(partition by ... order by ...)
sum() over(partition by ... order by ...)
avg() over(partition by ... order by ...)
first_value() over(partition by ... order by ...)
last_value() over(partition by ... order by ...)
lag() over(partition by ... order by ...)
lead() over(partition by ... order by ...)

聚合函数,将多行数据合并成一行数据;而开窗函数则是将一行数据拆分成多行。

 

开窗函数可以满足上述问题,同事也可以满足其他问题。例如:求每个班最高成绩学生的信息。

分析:每个人学号一定是不同的,名字可能有重名,最大复杂的情况是,每个班最高成绩可能不止一个。

本文由美高梅游戏平台网站发布于气血双补,转载请注明出处:开窗函数

关键词:

上一篇:SQL语句【T-SQL汇总】

下一篇:没有了

最火资讯