mysql 8.0 窗口函数 之 序号函数 与 sql server 序号函数 一样

sql server 序号函数

序号函数

  1. ROW_NUMBER() 顺序排序
  2. RANK() 并列排序,会跳过重复的序号,比如序号为1,1,3
  3. DENSE_RANK() 并列排序,不会跳过重复的序号,比如 序号为 1,1,2

语法结构

函数 over (  [ partition by 字段名1, [ 字段2,。。。字段n]  order by 字段名 ASC | DESC  ] )

## 或者
函数 over 窗口名  ... ..window 窗口名  as ( [ partition by 字段名  order by 字段名  asc  |  DESC ] )

### over  关键字 指定函数窗口的范围
       如果省略后面括号中的内容,则窗口会包含满足where 条件的所有记录,窗口函数会基于所有满足where条件的记录  **进行计算**
       如果over 关键字后面的括号不为空,则可以使用如下语句设置窗口
       窗口名:为窗口设置一个别名,用来表示窗口,  放在  sql  最后位置
       partition by 子句:指定窗口函数按照哪些字段进行分组。分组后,窗口函数可以在**每个分组中分别**执行。
       order by 子句:指定窗口函数按照哪些字段进行排序,执行排序操作使窗口函数按照排序后的数据记录的**顺序**进行编号
       

select  RANK() over ( partition by course by  score  desc ) as 排名,stu_name
from   stu_grade


#   方法2 
select  RANK() over  cnd  as 排名,stu_name
from   stu_grade
where window cnd as  ( partition by course by  score  desc ) 

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

窗口函数的优点

使用窗口函数,只用了一步就完成了查询,而且,由于没有用到临时表,执行的效率也更高了。很显然,在这种需要用到分组统计的结果对每一条记录进行计算的场景下,使用窗口函数更好

窗口函数的作用类似于在查询中对数据进行分组,不同的是,分组操作会把分组的结果聚合成一条记录,而窗口函数是将结果置于每一条数据记录中。

窗口函数可分为: ①静态窗口函数②动态窗口函数
静态窗口函数的窗口大小是固定的,不会因为记录的不同而不同
动态窗口函数的窗口大小会随着记录的不同而变化。