开窗函数(分析函数)

2.7.1 特点:开窗函数也就是在满足某种条件的记录集合上执行的特殊函数;

对于每条记录都要在此窗口内执行函数;

有的函数随着记录不同,窗口大小都是固定的,这种属于静态窗口;

有的函数则相反,不同的记录对应着不同的窗口,这种动态变化的窗口叫滑动窗口;

开窗函数的本质还是聚合运算,只不过它更具灵活性,它对数据的每一行,都使用与该行相关的行进行计算并返回计算结果。

2.7.2 开窗函数和普通聚合函数的区别聚合函数是将多条记录聚合为一条;而开窗函数是每条记录都会执行,有几条记录执行完还是几条

聚合函数也可以用于开窗函数中。

2.7.3 语法开窗函数名([]) over([partition by ] [order by [desc]] [])partition by子句:按照指定字段进行分区,两个分区由边界分隔,开窗函数在不同的分区内分别执行,在跨越分区边界时重新初始化。

order by子句:按照指定字段进行排序,开窗函数将按照排序后的记录顺序进行编号。可以和partition by子句配合使用,也可以单独使用。

frame子句:当前分区的一个子集,用来定义子集的规则,通常用来作为滑动窗口使用。

关于over的参数over参数为空,没有指定分区、排序、滑动窗口时,开窗函数将整个表作为一个区,默认计算的是所有值;

over指定了分区,未指定排序和滑动窗口,开窗函数默认计算分区内的所有值;

over指定了分区、排序,未指定滑动窗口,开窗函数默认计算的时第一行到当前行的值;

2.7.4 滑动窗口范围指定的两种方式方式一:基于行

对于滑动窗口的范围指定,通常使用 between frame_start and frame_end 语法来表示行范围,frame_start和frame_end可以支持如下关键字,来确定不同的动态行记录:current row 边界是当前行,一般和其他范围关键字一起使用

unbounded preceding 边界是分区中的第一行

unbounded following 边界是分区中的最后一行

expr preceding 边界是当前行减去expr的值

expr following 边界是当前行加上expr的值

移动平均可用来消除差额较大的情况,平滑数据方式二:基于范围

和基于行类似,但有些范围不是直接可以用行数来表示的,比如希望窗口范围是一周前的订单开始,截止到当前行,则无法使用rows来直接表示,此时就可以使用范围来表示窗口:interval 7 day preceding。

2.7.5 开窗函数分类动态窗口函数:first_value() / last_value()/nth_value()/聚合函数用于开窗

如没有指定排序和滑动窗口范围,默认计算的是分区内的所有记录。 指定分区和排序后,如没有指定滑动窗口范围,默认计算的是分区内的第一行到当前行。静态窗口函数:row_number() / rank() / dense_rank()/percent_rank() / cume_dist()/lag() / lead()/ntile()

不管是否指定滑动窗口范围,窗口都是固定的,所以指定的滑动窗口范围无效。

2.7.6 按照函数功能不同,MySQL支持的开窗函数分为如下几类:序号函数:row_number() / rank() / dense_rank()

函数名显示内容显示样式row_number()显示分区中不重复不间断的序号1,2,3,4...dense_rank()显示分区中重复不间断的序号1,1,2,3,3...rank()显示分区中重复间断的序号1,1,3,4...分布函数:percent_rank() / cume_dist()percent_rank():和之前的rank()函数相关,每行计算:(rank - 1) / (rows - 1)

其中,rank为rank()函数产生的序号,rows为当前窗口的记录总行数。rank() over(partition by user_no order by amount desc) rank1,

percent_rank() over(partition by user_no order by amount desc) percentcume_dist(): 分组内小于等于当前rank值的行数/分组内总行数

示例:查询大于等于当前订单金额的订单比例rank() over(partition by user_no order by amount desc) rank1,

cume_dist() over(partition by user_no order by amount desc) cume前后函数:lag() / lead()

分区中位于当前行前n行(lag)/后n行(lead)的记录值

示例:查询上一个订单距离当前订单的间隔天数lag(create_date,1) over(partition by user_no order by create_date) last_date头尾函数:first_value() / last_value()

分区中的第一个/最后一个指定参数的值

示例:查询截止到当前订单,按照日期排序第一个订单和最后一个订单的订单金额first_value(amount) over(partition by user_no order by create_date) first_amount,

last_value(amount) over(partition by user_no order by create_date) last_amount其他函数:nth_value() / nfile()nth_value(expr,n):返回窗口中第N个expr的值,expr可以是表达式,也可以是列名

示例:每个用户订单中显示金额排名第二和第三的订单金额nth_value(amount,2) over(partition by user_no order by amount) second_amount,

nth_value(amount,3) over(partition by user_no order by amount) third_amount

2. nfile(n):将分区中的有序数据分为n个桶,记录桶号

示例:将每个用户的订单按照订单金额分成3组

此函数在数据分析中应用较多,比如由于数据量大,需要将数据平均分配到N个并行的进程分别计算,此时就可以用nfile(n)对数据进行分组,由于记录数不一定被n整除,所以数据不一定完全平均,然后将不同桶号的数据再分配。

rank 开窗函数_开窗函数(分析函数)相关推荐

  1. c语言程序 中断函数示例,单片机_C语言函数_中断函数(中断服务程序)

    c语言中的中断函数注意事项 单片机_C语言函数_中断函数(中断服务程序) 在开始写中断函数之前,我们来一起回顾一下,单片机的中断系统. 中断的意思(学习过微机原理与接口技术的同学,没学过单片机,也应该 ...

  2. java 箭头函数_箭头函数丶Java教程网-IT开发者们的技术天堂

    基本用法 在ES6中允许使用 => 来定义函数,如下: var f = a => a; console.log(f(1)); //1 就等同于 var f = function(a){ r ...

  3. c++ error函数_回调函数地狱

    学习异步JS的时候最头大的就是看到一层一层嵌套的函数回调.每次看到就一万个wtf/wth在心中飘过.当然,不仅我一个人这样.外国的同行称之为:Callback Hell---回调函数地狱.如果谷歌一下 ...

  4. python虚函数_虚函数和纯虚函数的区别

    首先:强调一个概念 定义一个函数为虚函数,不代表函数为不被实现的函数. 定义他为虚函数是为了允许用基类的指针来调用子类的这个函数. 定义一个函数为纯虚函数,才代表函数没有被实现. 定义纯虚函数是为了实 ...

  5. java中钩子函数回调函数_钩子函数和回调函数

    一般认为,钩子函数就是回调函数的一种,其实还是有差异的,差异地方就是:触发的时机不同. 先说钩子函数: 钩子(Hook)概念源于Windows的消息处理机制,通过设置钩子,应用程序对所有消息事件进行拦 ...

  6. python 如何调试函数_使用函数 - python断点调试方法

    清单 7. 使用函数的例子 import pdb def combine(s1,s2): # define subrouTIne combine, which... s3 = s1 + s2 + s1 ...

  7. java中rank函数_排位函数PERCENTRANK如何使用

    函数PERCENTRANK,它的功能是:返回某个数值在一个数据集合中的百分比排位,可用于查看数据在数据集中所处的位置. 具体应用,比如:计算某个分数在所有考试成绩中所处的位置. 一.函数用法 函数公式 ...

  8. 自定义函数_自定义函数,让你的表格为所欲为

    自定义函数可以做什么?可以让你的表格为所欲为! 这篇文章教你如何掌握自定义函数. 函数是大家在使用 Excel 工作的过程中经常会用到的. 比如大家已经很熟悉了的求和函数 SUM,计数函数 COUNT ...

  9. python callback函数_回调函数callbacks

    TensorFlow的中阶API主要包括: 数据管道(tf.data) 特征列(tf.feature_column) 激活函数(tf.nn) 模型层(tf.keras.layers) 损失函数(tf. ...

  10. java中钩子函数回调函数_钩子函数 和回调函数

    标签: http://blog.csdn.net/lipeionline/article/details/6369657  转自 也可以这样,更容易理解:回调函数就好像是一个中断处理函数,系统在符合你 ...

最新文章

  1. 现代化 Web 应用开发实战
  2. [elk]logstash grok原理
  3. java关键字整理_【java基础知识整理】java基础语法之关键字
  4. mysql查询报错: ORDER BY clause is not in GROUP BY..this is incompatible with sql_mode=only_full_group_by
  5. Prince2与PMP的区别
  6. Java跨域请求cooking共享,关于HTML5中的sessionStorage和localStorage
  7. 大牛出招|分分钟解决 MySQL 查询速度慢与性能差
  8. redis:set数据类型和操作
  9. Git warning:LF will be replaced by CRLF in readme.txt的原因与解决方案
  10. Xna环境在PC平台下的功能扩展
  11. 特征根法--递推数列前4列
  12. PHP面向对象笔记(兄弟连)
  13. java题目:有n个整数,使其前面各数顺序向后移m个位置,最后m个数变成最前面的m个数
  14. 2021年机修钳工(中级)报名考试及机修钳工(中级)考试资料
  15. 详解经典进程同步问题(生产者消费者问题/哲学家进餐问题/读者写者问题)_OS
  16. 【英语语法入门】 第14讲 副词
  17. cypress——前端自动化测试框架
  18. html+css 导航条 变色
  19. 织梦全自动php采集插件下载,织梦dedecms自动采集伪原创处理插件-织梦插件
  20. SpringBoot从入门到精通教程(七):集成Redis

热门文章

  1. 485接口EMC电路设计方案
  2. 立体匹配算法(局部立体匹配 、全局立体匹配 、深度学习立体匹配 )
  3. 软件设计师教程---第一章计算机系统知识
  4. 【多元统计分析及R语言建模】第一章第 多元统计分析的概述
  5. 联想笔记本计算机在哪里找不到,联想笔记本电脑找不到WLAN怎么解决
  6. 【历史上的今天】11 月 14 日:微软发布 PowerShell;彼得·诺顿出生;Firefox 更换内核
  7. 小白白红队初成长(5)win权限维持
  8. 永久免费的内网端口映射工具推荐【无公网IP】
  9. 谷歌地图离线包-尝试
  10. 一阶系统开环传递函数表达式_带钢纠偏液压系统模糊PID 控制与仿真