窗口函数是指什么?为什么要用它?怎么用?有哪些经典的案例?

1)窗口函数是什么?

窗口函数是OLAP(online analytical processing),顾名思义,可以对数据库内的数据实时分析处理。通俗来讲,把一簇大的数据拆分成多个范围,把一面墙划分成多个窗口。

<窗口函数>一般有以下两种,

1、专用窗口函数,包括rank,dense_rank,row_number等。

2、聚合函数,如sum,avg,count,max,min等。

特点:

1、窗口函数有特定的语法结构,使用起来就像一个独立的子句。

<

2、窗口函数一般用于对where或者group by子句处理后的数据进行操作,(很明显按照sql执行顺序)所以窗口函数原则上只能写在select子句中。

窗口函数有什么用?

2)窗口函数怎么使用?

专用窗口函数

select 

#以成绩表score为例,要求“在每个课程内按成绩排名”

rank+partition by和group by子句的区别:前者是分组排名后总行数不变,后者分组汇总后总行数改变为几大类别。前者分组排序后返回新列且有排好序的数值,后者分组后产生一个虚拟表用于后续处理。总结如下:

简单来说,窗口函数的功能:

  1. 同时实现分组和排序的作用;
  2. 不减少原表的行数;
  3. 用在select子句后,语法结构;
select 

3)几个专用窗口函数的区别:

rank正常排序,并列的次序会占用位置;

dense_rank紧密排序,并列的次序不会占用位置,依然按自然数顺延;

row_number行数排序,完全不考虑并列的情况,按照行数依次排序;

面试经典排名问题(分组功能可选)

在库中score表中的内容,记录了每个学生所选的课程,和对应的成绩。

#现在需要按成绩来排名,如果两个分数相同,那么排名要是并列的且不占位置,类似1,1,1,2;

面试经典topN问题

比如如何找到每个类别下的number1?如何找到每个类别下XX方面排在前面的5个商品?

实质就是常见的:分组取最大值,最小值,每组最大的N条记录(topN记录)

在库中score表中的内容,记录了每个学生所选的课程,和对应的成绩。

#1每组最大记录:按课程号分组取成绩最大值所在行的全部数据;

#2每组最小记录:按课程号分组取成绩最小值所在行的全部数据;

#3每组最大的N条记录:查询每个学生各科成绩前两名的记录

解题思路:针对1,2两题,group by子句和汇总函数不能得到全部的行和列数据,因此考虑使用“汇总函数+子查询”结合使用得到完整的数据。

解题思路:针对3题,同样的group by子句不能得到全部的行和列数据,而且order by+limit也不适用于分别取出每一组内的限定行数。

而由上面的对比可知,窗口函数rank() 能够实现在分组的同时保留全部数据且进行排序,因而topN适用窗口函数一步到位:

正确写法,窗口函数使用后再作为表子查询
窗口函数只能放在select子句中,因此直接在where子句中使用窗口函数中的字段作为过滤条件,会报错。

显然使用窗口函数解决topN问题更加流畅,上面1,2题同样可以按照3题的思路进行解决。

select 

4)聚合函数作为窗口函数

将聚合函数替代专用窗口函数(rank())的位置即可。语法如下::

select 

比如0004号,在使用sum窗口函数后的结果,是对0001,0002,0003,0004号的成绩求和,若是0005号,则结果是0001号~0005号成绩的求和,以此类推。

从上图执行结果来看,聚合函数作为窗口函数,是对自身所处位置,以及位于自身记录以上的数据进行sum,avg,max,min,count进行处理的结果。

注意:这里的自身记录,以及自身记录以上....一定要是有一个次序比如(0001,0002,0003),否则并列的话会都当作自身记录,会在一起处理,几行数据也会一致。下面有示例图。

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

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

那么问题是?对使用聚合函数作为窗口函数时,+partition by分组后,此时还是对当前记录和记录之上的数据进行聚合处理?事实上相当于是对“组内求平均”,因为此时组内字段值是一样的,(也即都算作当前记录),一组作为一个框架处理。示例如下:score表中按课程号分组求平均成绩...

如何在每个组内进行比较

问题:以score表为例,查找单科成绩高于该科目平均成绩的学生名单

解题思路:第一思路是前面用过的“聚合函数+关联子查询”,也适合组内比较或者组内最大最小值一类。 第二思路是使用“聚合函数做窗口函数”,同时实现聚合,分组,排序等功能。如下:

这一部分理解上 出了偏差,一直纠结于成绩大于avg_score上,认为avg_score是多个值,混淆到“列子查询”上去了。 此处是表内比较,数据一行一行执行的。——说明对sql执行顺序和单步运行结果仍不够熟悉;

(筛选条件可以是常量,字段,表达式,函数 。。)

5)窗口函数的移动平均(rows...preceeding)

语法如下:

select 

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

由于这里可以通过preceding关键字调整作用范围,在以下场景中非常适用:

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

直接使用聚合函数avg的窗口函数 来举例说明,以score表为例:

#使用聚合函数avg的窗口函数查询学生的平均成绩(未移动平均前且用来排序的字段有并列值)

#使用聚合函数avg的窗口函数查询学生的平均成绩(未移动平均前且用来排序的字段唯一)

#使用聚合函数avg的窗口函数查询学生的平均成绩(移动平均后)

这三个不同的查询结果体会一下。再看下面的例子,

这张图中学号按次序排列,按照移动平均rows 2 preceding执行后得到的。每一行得到的结果,都是当前行和前面2行的平均(共3行)。想要计算当前行与前n行(共n+1行)的平均时,只要调整rows…preceding中间的数字即可。

框架:在移动平均中,被选出的数据可以理解为构成一个“框架”。数据的运算发生在这个框架之中。

窗口函数——知识点总结

1、窗口函数的语法

<

1)其中<窗口函数>的位置,可使用以下两种函数:①专用窗口函数,如rank,dense_rank,row_number等适合“经典排序问题”“排序topN问题”等;②聚合函数,如sum,avg,count,max,min等适合“组内比较、筛选问题”等;

2)partition by子句可以省略,也就是不指定分组。

2、窗口函数有以下功能:

1)可同时实现分组(partition by)和排序(order by)的功能;

2)且不减少原表的行数,所以经常用来在每组内排名;

3、注意事项

1)窗口函数原则上只能写在select子句中;

2)因为只能放在select子句中,所以如果需要对窗口函数的结果进行条件筛选,而SQL主查询中select执行顺序靠后,因此可以考虑把select 窗口函数改成一个表子查询。执行顺序就变成了第一顺位。

4、应用场景

可以对窗口函数之后再加条件_SQL 窗口函数——解决实际问题相关推荐

  1. inner join on 加条件和where加条件_SQL学习笔记 - GROUP BY / JOIN / UNION

    最近在DataCamp上学习SQL(基于PostgreSQL)的课程,本文主要记录自己易记混的点,以便日后参考学习,不做原理讲解. GROUP BY(分组)一般和聚合函数一起使用,包括COUNT(), ...

  2. c语言有一个正整数加上100,c语言编程实现:一个整数,它加上100后是完全平方数,再加168又是完全平方数,求该数。...

    满意答案 问题:一整数,它加100后是完全平方数,再加168还是完全平方数,求该整数 解题思路:设该数为x,它加100后是A,再加168为B. 则因为A是完全平方数, 所以A为正数,且A=y*y,y为 ...

  3. 调用另一个cpp的变量_再谈条件变量—从入门到出家

    再谈条件变量-从入门到出家 C语言--条件变量 条件变量是在线程中以睡眠的方式等待某一条件的发生: 条件变量是利用线程间共享的全局变量进行同步的一种机制: 一个线程等待"条件变量的条件成立& ...

  4. inner join on 加条件和where加条件_图解 SQL 中各种连接 JOIN

    先用文字来捋一下思路,数据库操作中无非就是「 增删查改 」,其中「 查」用得最多且最复杂,变化多端.查询的时候,我们可以只是单表查询,也可以是多表连接查询,单表查询中的学问也很大,但限于篇幅,本次主要 ...

  5. 五分钟精通正则表达式,如果没精通,那就再加两分钟

    五分钟搞定正则表达式,如果没搞定,那就再加两分钟 一.正则表达式介绍 正则表达式,又称规则表达式.(英语:Regular Expression,在代码中常简写为regex.regexp或RE),计算机 ...

  6. 再谈条件变量—从入门到出家

    再谈条件变量-从入门到出家 C语言--条件变量 条件变量是在线程中以睡眠的方式等待某一条件的发生: 条件变量是利用线程间共享的全局变量进行同步的一种机制: 一个线程等待"条件变量的条件成立& ...

  7. 补码(为什么按位取反再加一):告诉你一个其实很简单的问题

    ---------------------  作者:wenxinwukui234  来源:CSDN  原文:https://blog.csdn.net/wenxinwukui234/article/d ...

  8. 正则表达式里转义字符_五分钟搞定正则表达式,如果没搞定,再加两分钟

    五分钟搞定正则表达式,如果没搞定,再加两分钟 [这是 ZY 第 18 篇原创文章] 文章概览 一.正则表达式介绍 正则表达式,又称规则表达式.(英语:Regular Expression,在代码中常简 ...

  9. xp系统设置锁定计算机,系统锁定时不关机的诀窍 给XP系统关闭计算机再加一把锁...

    很多用户抱怨在使用电脑的过程中,总是经常会被琐碎的事情打断,有时候难免暂时离开电脑,处于便利和资料安全,我们往往会按下"Windows+L"来锁定计算机.这样,操作方便同时又能阻止 ...

最新文章

  1. windows下安装mysql压缩包版[转]
  2. 微信小程序原生 地区选择器
  3. 5G 比 4G 快,不只是因为......
  4. java登陆密码验证失败,java用户名密码验证示例代码分享
  5. MTK 驱动(20)--- camera 相机启动时间优化
  6. 解决Pycharm里远程调试缺乏DISPLAY环境变量的TkAgg报错
  7. 运行linux的配置,Linux系统运行级别配置
  8. 突发:格鲁吉亚所有公民的个人详情被泄露在黑客论坛
  9. linux记录iptables日志,linux – 如何配置syslog.conf文件,在单独的文件中记录iptables消息?...
  10. 【HDOJ】1261 字串数【组合数学--排列+代数】
  11. 数据库同步——中间数据库的实现方式
  12. mysql rpm mar_Centos7.3离线(rpm方式)安装mysql服务
  13. 程序员35岁以后干什么?大龄程序员现状揭秘
  14. 配置CKFinder(Java版)
  15. 金蝶kis修改服务器,金蝶kis 修改服务器地址
  16. 领先招聘和支付平台Deel筹资1.56亿美元,成为独角兽企业
  17. MacOS 打开软件出现 ‘xxx‘ “将对您的电脑造成伤害。 您应该将它移到废纸篓。“的解决方式
  18. 进阶的阿牛哥之如何存储每日数据到csv或txt文件(如何实现换行)
  19. 我是如何投资数字货币的(1.2版)
  20. 笔记本电脑右下角的电池图标不显示如何找出

热门文章

  1. 中国银行业100强发布,头部名企为何选择永洪科技?
  2. java 中window_教你如何在windows上安装Java
  3. python自动化弹框_Python+webdriver自动化脚本弹出框定位
  4. SQL语言之DQL语言学习(八)多表查询/链接查询 SQL92学习
  5. python下几种打开文件的方式
  6. Python创建一个循环链表、双向循环链表
  7. python中 使用join()方法 对各种数据类型中元的素进行合并拼接
  8. mysql+用户批量导出,python批量导出导入MySQL用户的方法
  9. mysql编码无效_mysql的严格模式与无效字符编码问题
  10. C语言数据结构(大话数据结构——笔记3)第五章:串(字符串)