一文搞定数分面试必考题之:窗口函数

文章图片
转自:赵小洛洛洛
写在前面:
窗口函数的主要作用是对数据进行分组排序、求和、求平均值、计数等 。 对于数据从业者来说 , sql窗口函数在实际工作中具备非常广泛的应用场景 。 可以大大的提高数据查询效率 , 同时也是数据类相关岗位的面试/笔试的必考点 。 所以不论是在职的分析师 , 还是准备找工作的同学 , 都必须要牢牢掌握窗口函数的概念及用法 。 接下来让我们详细了解一下窗口函数的前世今生吧 。
01-窗口函数基本语法
文章图片
在窗口函数的基本语法中 , 最重要的是去理解partitionby , partitionby划分的范围被称为窗口 , 这也是窗口函数的由来 。 其次是orderby , 它决定着窗口范围内的数据以什么样的方式排序 。 下面的例子详细的介绍了窗口函数的基本语法和功能 。
例一代码如下
文章图片
在上面的代码中可以看出 , 是按照产品的类型去分组 , 在组内以价格的顺序升序排列 , 运行的结果如下 。 (rank的排序下面会单独说)
文章图片
至于窗口函数与groupby的区别:两个orderby的区别 , 第一个窗口函数中的orderby只是决定着窗口里的数据的排序方式 , 第二个普通的orderby决定查询出的数据以什么样的方式整体排序;窗口函数可以在保留原表中的全部数据之后 , 可以对某些字段做分组排序或者计算 , 而groupby只能保留与分组字段聚合的结果;在加入窗口函数的基础上SQL的执行顺序也会发生变化 , 具体的执行顺序如下(window就是窗口函数);
文章图片
02-窗口函数类别
专用窗口函数例如rank、row_number、lag和lead等 , 在窗口函数中有静态函数和动态函数的分类 , 具体的划分如下 。
文章图片
作为窗口函数的聚合函数 , 常见的聚合函数有sum、avg、max、min跟count 。 他们跟窗口函数组合到一起 , 就会把聚合函数的功能和窗口函数组合在一起 。 例二代码及结果为
文章图片
文章图片
从上面的例子可以看出 , 在没有partitionby的情况下 , 是把整个表作为一个大的窗口 , SUM相当于向下累加 , AVG相当于求从第一行到当前行的平均值 , 其他的聚合函数均是如此 。
注意点:
1、在使用专用的窗口函数时 , 例如rank、lag等 , rank括号里是不需要指定任何字段的 , 直接空着就可以;
2、在使用聚合函数做窗口函数时 , SUM括号里必须有字段 , 得指定对哪些字段执行聚合的操作 。 在学习的初期很容易弄混 , 不同函数括号里是否需写相应的字段名;
03-三种分组排序的区别-row_number、rank、dense_rank
RANK-计算排序时 , 如果存在相同位次的记录 , 则会跳过之后的位次 。 有3条记录排在第1位时:1、1、1、4;DENSE_RANK-同样是计算排序 , 即使存在相同位次的记录 , 也不会跳过之后的位次 。 有3条记录排在第1位时:1、1、1、2;ROW_NUMBER-赋予唯一的连续位次,有3条记录排在第1位时:1、2、3、4;【一文搞定数分面试必考题之:窗口函数】示例 , 在下面的执行结果是以整个表作为窗口 , 可以清楚的看出三种排序函数的不同之处 。 (如果想要唯一的排序就直接用row_number)
文章图片
04-窗口函数进阶-滑动窗口函数
在写窗口函数时 , orderby后面可以有参数 , rows/range和preceding跟following , 在组合使用这些参数后 , 窗口就会变成滑动窗口 , 因为涉及到动态窗口 , 所以在理解上比较抽象 。
1、Preceding
文章图片
文章图片
Rows2preceding中文的意思是之前的两行 , preceding可以把它理解为不含当前行情况下截止到之前几行 。 根据上图可以看出在每一行 , 都会求出当前行附近的3行(当前行+附近2行)数据的平均值 , 这种方法也叫作移动平均 。
- 多年|搞笑GIF:笑场,我们是认真的!我笑也是认真的!
- 为啥富人搞农业容易失败?3个无法回避的难题,不是有钱就能解决
- 就是|搞笑GIF: 这就是自行车在太阳下暴晒的结果
- 这是|搞笑GIF: 你这一脚也太狠了吧,你这是救人还是害人?
- 小明|搞笑gif趣图:为何你的牙齿如此优秀?还真没想到啊
- 健身|搞笑GIF: 健身房遇到的姑娘, 你穿这么高的鞋, 你确定你是来健身的?
- 电话|搞笑GIF动图:小伙子虽然还在硬撑着,但是内心已经在滴血
- 胖子|搞笑GIF: 我本来是瘦子, 硬生生的被蚊子给叮成了胖子
- 候机室|搞笑gif趣图:很好摸的样子,想揉!
- 搞笑|搞笑GIF趣图:媳妇,煲汤把锅都毁了,以后还是长点心吧!
