一、窗口函数有什么用?

在日常生活中,经常会遇到需要在每组内排名,比如下面的业务需求:

排名问题:每个部门按业绩来排名

topN问题:找出每个部门排名前N的员工进行奖励

面对这类需求,就需要使用sql的高级功能窗口函数了。

二、什么是窗口函数,也叫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 子句中。

1.专用窗口函数rank

想要每个班级内按成绩排名的结果

select *,
rank() over(partition by 班级 order by 成绩 desc) as ranking
from 班级表

为什么叫“窗口”函数?

因为partition by分组后的结果称为“窗口”,表示“范围”的意思。

简单来说,窗口函数有以下功能:

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

2)不减少原表的行数

3)语法见前

2.专用窗口函数rank,dense_rank, row_number有什么区别?

select *,
rank() over(order by 成绩 desc) as ranking
dense_rank() over(order by 成绩 desc) as dense_rank
row_number() over(order by 成绩 desc) as row_num
from 班级表

从上面结果可以看出:

rank 函数:如果有并列名次的行,会占用下一名次的位置。

dense_rank 函数:如果有并列名次的行,不占用下一名次的位置。

row_number函数:不考虑并列名次的情况。

3. top N问题

每组最大的N条记录

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

4.聚合窗口函数

select *,
sum(成绩) over(order by 学号) as current_sum
from 班级表

如上图,聚合函数sum在窗口函数中,是对自身记录、及位于自身记录以上的数据进行求和的结果。平均、计数、最大最小值也是同理。

这样使用窗口函数有什么用?

聚合函数作为窗口函数,可以在每一行的数据里直观的看到,截止到本行数据,统计数据是多少(最大值、最小值等)。同时可以看出每一行数据,对整体统计数据的影响。

5.查找单科成绩高于该科目平均成绩的学生名单

1)窗口函数法

select *
from(select *,avg(成绩) over(partition by 科目) as avg_score from 成绩表) as b
where 成绩>avg_score

2)关联子查询法

见之前文章

6.窗口函数的移动平均

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

每一行得到的结果,都是当前行和前面2行的平均(共3行)。

这样使用窗口函数有什么用呢?

在公司业绩名单排名中,可以通过移动平均,直观地查看到与相邻名次业绩的平均、求和等统计数据。

select函数_SQL高级功能:窗口函数相关推荐

  1. sql取整数_SQL高级功能

    1.窗口函数 窗口函数用于日常工作中,经常会遇到的需要在每组内排名的问题,比如: 排名问题:每个部门按业绩来排名 topN问题:找出每个部门排名前N的员工进行奖励 此时需要使用sql的高级功能窗口函数 ...

  2. SQL高级功能-窗口函数及其经典题目

    窗口函数 1.窗口函数有什么用? 2.什么是窗口函数? 3.如何使用窗口函数 1.专用窗口函数rank 2.专用窗口函数rank, dense_rank, row_number的区别 4.经典面试问题 ...

  3. sql取最大值的那一行_SQL高级功能

    1. 什么是窗口函数?(---MySQL 8以上才有该函数---) 1) 窗口函数有什么用? 日常工作中,时常遇到需要在每组内排名,比如: 1.1 排名问题:每个部门按业绩排名 1.2 TopN问题: ...

  4. 阻塞、非阻塞的概念和select函数的阻塞功能

    (1)阻塞block 所谓阻塞方式block,顾名思义,就是进程或是线程执行到这些函数时必须等待某个事件的发生,如果事件没有发生,进程或线程就被阻塞,函数不能立即返回. 例如socket编程中conn ...

  5. 利用select 函数 实现sleep功能 达到纳米级

    2019独角兽企业重金招聘Python工程师标准>>> 利用select 函数 实现sleep达到纳米级 . 当然这个数据计算出来不准确,本身就包含程序执行本身消耗的数量. 原理是把 ...

  6. sql over函数_SQL 高级函数

    今天是高端局,都是超级高大上的内容,惯例上目录 今天觉得红黑配色好好看呀 今天没有什么具体的栗子合集,大家的应用场景都很不一样,so,到具体知识点,我们再具体举栗子. 窗口函数 概念: 窗口函数,也叫 ...

  7. sql server累计求和函数_SQL基础--SQL高级功能

    一.窗口函数有什么用? 在日常工作中,经常会遇到需要在每组内排名,比如下面的业务需求: 排名问题:每个部门按业绩来排名 topN问题:找出每个部门排名前N的员工进行奖励 面对这类需求,就需要使用sql ...

  8. select函数fdwrite用法_通俗易懂的学会:SQL窗口函数

    ​一.窗口函数有什么用? 在日常工作中,经常会遇到需要在每组内排名,比如下面的业务需求: 排名问题:每个部门按业绩来排名 topN问题:找出每个部门排名前N的员工进行奖励 面对这类需求,就需要使用sq ...

  9. 数据窗口retrieve查询结果生成新表_SQL系列之窗口函数及经典使用场景,如topN排名问题...

    日常生活中,经常会遇到需要在每组内排名的问题,比如每个部门按业绩排名,找出每个部门排名前N的员工等,面对这类需求,就需要使用SQL的高级功能--窗口函数. 窗口函数,也叫联机分析处理函数(Online ...

最新文章

  1. 利用jQuery实现回收站删除效果
  2. Spring boot的Spring MVC自动配置
  3. springboot整合hibernate_峰哥说技术系列-17 .Spring Boot 整合 Spring Data JPA
  4. (转)解决fasterxml中string字符串转对象json格式错误问题(无引号 单引号问题)...
  5. 第5月第8天 jsonmodel
  6. TPL Dataflow组件应对高并发,低延迟要求
  7. 计算机检索技术与技巧的检索式为,第四章计算机检索技术和数据库检索方式.ppt...
  8. MAC电脑Command键怎么调换为Control键
  9. Oracle Telnet 1521 失败
  10. java snakeyaml_SnakeYaml快速入门和使用
  11. 关于电的计算机公式,电功率计算公式大全
  12. 通过存储控制器访问外设
  13. 计算机高级工程师职称评定条件,高级工程师职称评定条件是什么
  14. Android开发之智能聊天机器人
  15. 莫名奇妙的异常010:Unexpected server response (0) while retrieving PDF
  16. php特性之intval学习小记
  17. oracle 导出身份证号_oracle 根据身份证号计算出生日期
  18. wiringPi库与bcm_2835区别
  19. [转]Jexus的常用操作和基本配置
  20. 在二维码上添加图片主题(支持链接跳转)

热门文章

  1. for循环false 终止 python_python3.5.1给用户3次无效的尝试,然后终止pgm(Simple FOR循环)...
  2. C语言 实现登录注册功能
  3. Linux Ubuntu16.04界面美化
  4. 嵌入式Linux安装Python环境,linux环境下安装python 3
  5. 计算机语言低下限高上限,学习语言有没有上限
  6. ugui源码_UGUI整体解决方案基础篇(Unity 2019)
  7. 系统新模块增加需要哪些步骤_想要吸引人流,儿童乐园需要增加哪些新设备呢...
  8. android搭建opencv开发环境,Android Studio搭建opencv开发环境
  9. python全局变量global线程安全_对python多线程与global变量详解
  10. nodejs mysql 返回json_python向mysql中存储JSON及Nodejs取出