开窗函数为 : over()
说明
oracle开窗函数和group by还是有不一样的地方,
- group by 是分组后就直接去重了,
- 开窗函数分组后不去重,并且还可以进行排序
使用方法
over(PARTITION BY age ) 表示对结果集按照age进行分区
实战
新建一个user_test
表,建表语句为:
create table user_test(
id number(20) not null,
name varchar2(50),
age number(3)
)
表数据如下,对没错,一共就四条数据,数据量少的情况下理解更容易,不然只有写文章的人能看懂,看文章的人却一脸懵;
当我们使用group by 语句时,得出来的结果是这样的,这是group by 的特性,分组后会自动去重
但是当我们使用开窗函数时,分组的同时,不会去重,并且还给你排好序
通过以上2个例子可以更好的理解开窗函数和group by的区别;但是开窗函数远不止这些用法
接下来我们看看rank()的用法
首先增加2条记录,最后的5和6是新加的
rank()
编号的时候排序字段会参与,数据相同的字段的编号也相同,总编号不变 1 2 2 4 5
dense_rank() 编号的时候排序字段会参与,数据相同的字段的编号也相同,总编号改变 1 2 2 3 4
其他用法
当我将列和统计count(*)一起查询时会报错,
但是当我在count(*)后面加上开窗函数之后就可以运行了