大家好
开窗函数又称开挂函数,功能强大,使用灵活,性能极佳。
Over 子句是标识。顾名思义,PARTITION 中文是分割的意思,ORDER 是排序的意思,所以翻译一下就是先把一组数据按照制定的字段进行分割成各种组,然后组内按照某个字段排序。
开窗函数是根据对基础查询行子集的计算,为子集中的每行计算一个标量结果值。行子集被称为‘窗口’。它基于与当前行相关的窗口描述符。
简单说,需要对一个集合执行计算并返回单个值。比如聚合计算,排名计算等。是分组查询和子查询的结合。
形式:
1 排名 : row_number/rank/dense_rank() over()
2 聚合: sum() over
3 其他:
first_value() over(partition by ... order by ...) 第一个
last_value() over(partition by ... order by ...) 最后一个
lag() over(partition by ... order by ...) 取出前n行数据
lead() over(partition by ... order by ...) 取出后n行数据
ratio_to_report() over(partition by ... order by ...) Ratio_to_report() 括号中就是分子,over() 括号中就是分母
实例:
举例:student表数据(sno编号,sname姓名,course科目,score成绩)
SELECT *
FROM student;
1. 对比rank和dense_rank
(1)使用rank:查询科目为Oracle的学生名次
SELECT sno,
sname,
course,
score,
rank() over(ORDER BY score DESC) AS 名次
FROM student
WHERE course = 'Oracle';
(2)使用dense_rank:查询科目为Oracle的学生名次
SELECT sno,
sname,
course,
score,
dense_rank() over(ORDER BY score DESC) AS 名次
FROM student
WHERE 1 = 1
AND course = 'Oracle';
以上可以说明:rank为不连续,dense_rank为连续
知识点:
1. 语法:rank() over(order by 排序字段 顺序)
dense_rank() over(partition by 分区字段 order by 排序字段 顺序)
2. partition by 关键字是分析性函数的一部分,与聚合函数不同的地方在于分析函数能返回以这个分组中的多条记录;
而聚合函数一般只有一条记录反映统计值。
partition by 用于给结果集分组,如果没有指定就会把整个结果集作为一个来分组,分区函数与排名函数一起使用。
3. 分区与分组有什么区别?
分区:将原始数据进行顺序排列(记录数不变)
分组:对原始数据进行聚合统计(记录数变少,每组返回一个结果)
希望对大家有帮忙。谢谢