sql大数据 基础 (开窗函数)

普通分组函数

select ssex,count(1) from student group by ssex
行数改变,只展示统计结果
开窗函数 不改变行数,展示自己及自己在某一分组下的地位
查询所有人的姓名性别,并展示每个人在同一性别下按照年龄排序的序号
select sno,sname,ssex,row_number() over(partition by ssex order by sage) from student;

一、什么是开窗函数
开窗函数/分析函数关键词:over()

开窗函数用于为行定义一个窗口(这里的窗口是指运算将要操作的行的集合),它对一组值进行操作,不需要使用GROUP
BY子句对数据进行分组,能够在同一行中同时返回基础行的列和聚合列。
开窗函数也叫分析函数,有两类:一类是聚合开窗函数,一类是排序开窗函数。
开窗函数的调用格式为:函数名(列名) OVER(partition by 列名 order by列名)
我们知道聚合函数对一组值执行计算并返回单一的值,如sum(),count(),max(),min(), avg()等,这些函数常与group by子句连用。
但有时候一组数据只返回一组值是不能满足需求的,如我们经常想知道各个地区的前几名、各个班或各个学科的前几名。这时候需要每一组返回多个值。用开窗函数解决这类问题非常方便。

开窗函数和聚合函数的区别如下:

(1)SQL 标准允许将所有聚合函数用作开窗函数,用OVER 关键字区分开窗函数和聚合函数。
(2)聚合函数每组只返回一个值,开窗函数每组可返回多个值。
注:常见主流数据库目前都支持开窗函数,但mysql数据库目前还不支持。
开窗函数与聚合函数计算方式一样,开窗函数也是对行集组进行聚合计算,但是它不像普通聚合函数那样每组只返回一个值,开窗函数可以为每组返回多个值。
开窗函数的语法为:over(partition by 列名1 order by 列名2[顺序是固定的,模块可以只有一个] ),括号中的两个关键词partition by 和order by 可以只出现一个。over() 前面是一个函数。

开窗函数主要分为以下两类:

窗口函数OVER()指定一组行,开窗函数计算从窗口函数输出的结果集中各行的值。
开窗函数不需要使用GROUP BY就可以对数据进行分组,还可以同时返回基础行的列和聚合列。
1.排名开窗函数
ROW_NUMBER、DENSE_RANK、RANK属于排名函数。
排名开窗函数可以单独使用ORDER BY 语句,也可以和PARTITION BY同时使用。
PARTITION BY用于将结果集进行分组,开窗函数应用于每一组。
ORDER BY[排名开窗函数必有order by
聚合函数 over中可以什么都不写] 指定排名开窗函数的顺序,在排名开窗函数中必须使用ORDER BY语句。
ROW_NUMBER()为每一组的行按顺序生成一个连续序号。
RANK()也为每一组的行生成一个序号,与ROW_NUMBER()不同的是如果按照ORDER BY的排序,如果有相同的值会生成相同的序号,并且接下来的序号是不连序的。例如两个相同的行生成序号2,那么接下来会生成序号4。
DENSE_RANK()和RANK()类似,不同的是如果有相同的序号,那么接下来的序号不会间断。也就是说如果两个相同的行生成序号2,那么接下来生成的序号还是3。
2.聚合开窗函数
很多聚合函数都可以用作窗口函数的运算,如SUM、AVG、MAX、MIN、COUNT。
聚合开窗函数只能使用PARTITION BY子句,ORDER BY不能与聚合开窗函数一同使用

几个排序函数row_number() over()、rank() over()、dense_rank() over() 的区别

(1) row_number() over():对相等的值不进行区分,相等的值对应的排名相同,序号从1到n连续。例:12345
(2) rank() over():相等的值排名相同,但若有相等的值,则序号从1到n不连续。如果有两个人都排在第3名,则没有第4名。例:12245
(3) dense_rank() over():对相等的值排名相同,但序号从1到n连续。如果有两个人都排在第一名,则排在第2名(假设仅有1个第二名)的人是第3个人。例:12234

常用开窗函数:

1.为每条数据显示聚合信息.(聚合函数() over())
2.为每条数据提供分组的聚合函数结果(聚合函数() over(partition by 字段) as 别名) --按照字段分组,分组后进行计算
3.与排名函数一起使用(row number() over(order by 字段) as 别名)
常用分析函数:(最常用的应该是1.2.3 的排序)
1、row_number() over(partition by … order by …)
2、rank() over(partition by … order by …)
3、dense_rank() over(partition by … order by …)
4、count() over(partition by … order by …)
5、max() over(partition by … order by …)
6、min() over(partition by … order by …)
7、sum() over(partition by … order by …)
8、avg() over(partition by … order by …)

练习

询学生的编号,姓名,并分别显示不同性别的最大年龄和最小年龄
select sno ,
sname,
max(sage) over(partition by ssex),
min(sage) over(partition by ssex)
from student;
查询不同课程的最高成绩
select distinct cno,
max(score) over(partition by cno)
from sc ;
–select * from sc;

你可能感兴趣的:(数据库,大数据,sql,mysql)