SQL语言——开窗函数

1.什么是开窗函数?

开窗函数与聚合函数计算方式一样,开窗函数也是对行集组进行聚合计算,但是它不像普通聚合函数那样每组只返回一个值,开窗函数可以为每组返回多个值。
开窗函数的语法为:
over(partition by col_1 order by col_2)

窗口函数over( )指定一组行,开窗函数计算从窗口函数输出的结果集中各行的值。
开窗函数不需要使用group by 就可以对数据进行分组,还可以同时返回基础行的列和聚合列。

开窗函数与聚合函数的区别:
①SQL标准允许将所有的聚合函数用作开窗函数,使用over 关键字区分开窗函数和聚合函数。
②聚合函数每组只返回一个值,开窗函数每组可以返回多个值。

2.排名开窗函数

排名开窗函数可以单独使用order by 语句,也可以和partition by 同时使用
以查询学生的学习成绩为例,有如下表:
SQL语言——开窗函数_第1张图片

  • row_number
    分组排序,按照指定的条件后进行排名,查询出来的数值相同也会进行连续排名。
    例如按照课程名称对成绩进行分组排序,SQL如下:
select id,
       name,
       subject,
       score,
       row_number()over(partition by subject order by score desc) as rank
from xwj_test_table

结果为:
SQL语言——开窗函数_第2张图片

  • dense_rank
    分组排序,按照指定的条件进行排名,数值相同的为并列排名,并不空出所占的名次
    例如按照课程名称对成绩进行分组排序,SQL如下:
select id,
       name,
       subject,
       score,
       dense_rank()over(partition by subject order by score desc) as rank
from xwj_test_table

结果为:
SQL语言——开窗函数_第3张图片

  • rank
    分组排序,按照指定的条件进行排名,数值相同的为并列排名,并空出所占名次。如果两者排名均为第N,则没有第N+1名次。
    例如按照课程名称对成绩进行分组排序,SQL如下:
select id,
       name,
       subject,
       score,
       rank()over(partition by subject order by score desc) as rank
from xwj_test_table

结果为:
SQL语言——开窗函数_第4张图片

3.聚合开窗函数

很多聚合函数都可以用作窗口函数的运算,如SUM、AVG、MAX、MIN、COUNT。聚合开窗函数只能使用partition by 子句,order by 不能与聚合开窗函数一同使用
例如加入一列为各个科目的平均成绩,SQL如下:

select id,
       name,
       subject,
       score,
       avg(score) over(partition by subject) as score_avg
from xwj_test_table

SQL语言——开窗函数_第5张图片

你可能感兴趣的:(SQL)