ITPub博客

首页 > 数据库 > > SQL高级查询窗口函数

SQL高级查询窗口函数

作者:浪花小雨滴 时间:2020-05-14 15:02:39 0 删除 编辑

一、窗口函数是什么

又叫OLAP函数,Online Anallytical Processing,联机分析处理,可以对数据库数据进行实时分析处理。窗口代表范围。

<窗口函数> over ( 
partition by <用于分组的列>
order by <用于排序的列名>
 )

<窗口函数>的位置,可以放以下两种函数:

  1. 专用窗口函数,rank,dense_ rank , row_number等
  2. 聚合函数,sum.avg, count , max ,min等

窗口函数是对where或者group by子句处理后的结果进行操作,所以窗口函数原则上只能写在select子句中。

二、窗口函数的使用

专用窗口函数rank

功能:

  1. 同时具有分组和排序的功能

partiton by将数据按要求分组,order by再在组内进行排序

2. 不减少原表的行数

相比于group by,rank函数不会改变分组生成表的行数;

而group by生成的表格,每组数据只有一行,所以会改变行数。

其他专用窗口函数

rank, dense_rank , row_ number三者区别

注意这三种窗口函数后的( )保持空即可

典型案例

  • 排名问题
-- 典型题1:排名问题 按成绩排名,如果两个分数相同,排名要是并列的
select *,dense_rank() over (order by 成绩 desc) as dese_rank from 班级表;
  • topN问题

万能模板:要求查询出每组内的最大N个数据

select * from (select *,row_number () over (partition by 
<分组的列名>  order by <排序的列名> desc)as ranking from 表名)as a
where ranking <= N;

三、聚合函数作窗口函数

与专用窗口函数用法完全一致,将窗口函数替换成聚合函数即可,但是聚合函数后的()内不为空,而是填入指定聚合的列名。

聚合函数的作用是对自身以及自身记录之上的所有数据作函数处理。

这样就可以直观地实时观测截止到某一行的数据情况,也可以看出每一行数据对整体结果的影响。

-- 查找单科成绩高于该科目平均成绩的学生名单
select * from (
select * ,avg(成绩) over( partition by 科目 )as avg_score from 各科成绩表 )as b
where 成绩>avg_score;

窗口函数的移动平均

select *,avg(成绩)over (order by 学号 rows 2 preceding)as current_avg from 班级表;

rows和preceding这两个关键字,代表 之前...行

上面语句就是之前2行,即所得结果是自身记录及前2行的平均

通过调整preceding即可调整作用范围,在公司业绩排名中,查看与相邻名词业绩的平均、求和等统计时很有用处。

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/31537575/viewspace-3149205/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2018-05-16

  • 博文量
    4259
  • 访问量
    39927