开窗函数的使用详解(窗口范围ROWS与RANGE图文详解)

这篇具有很好参考价值的文章主要介绍了开窗函数的使用详解(窗口范围ROWS与RANGE图文详解)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、函数写法

函数名(参数) OVER (PARTITION BY子句 ORDER BY子句 ROWS/RANGE子句)

由三部分组成: 函数名:如sum、max、min、count、avg等聚合函数以及lead、lag行比较函数等; over:
关键字,表示前面的函数是分析函数,不是普通的集合函数; 分组子句:over关键字后面挂号内的内容;

分析子句又由下面三部分组成: PARTITION BY :分组子句,表示分析函数的计算范围,不同的组互不相干; ORDER BY:
排序子句,表示分组后,组内的排序方式; ROWS/RANGE:窗口子句,是在分组(PARTITION
BY)后,组内的子分组(也称窗口),此时分析函数的计算范围窗口,而不是PARTITON。窗口有两种,ROWS和RANGE;

二、开窗的窗口范围ROWS与RANGE

1.范围限定用法 CURRENT ROW: 当前行
UNBOUNDED:不受控制的,无限的
UNBOUNDED PRECEDING: 区间的第一行
UNBOUNDED FOLLOWING:区间的最后一行
UNBOUNDED PRECEDING AND UNBOUNED FOLLOWING:针对当前所有记录的前一条、后一条记录,分组中的所有记录
PRECEDING:在…之前, N PRECEDING:当前行之前的N行,可以是数字用于RANGE数据范围限定,也可以是一个能计算出数字的表达式
FOLLOWING:在…之后,N FOLLOWING:当前行之后的N行,可以是数字用于RANGE数据范围限定,也可以是一个能计算出数字的表达式 ROWS BETWEEN
UNBOUNDED PRECEDING AND CURRENT ROW :指第一行至当前行的数据
ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING :指当前行到最后一行的汇总
ROWS BETWEEN 1 PRECEDING AND CURRENT ROW :指当前行的上一行(ROWNUM-1)到当前行的数据
ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING :指当前行的上一行(ROWNUM-1)到当前行的下一行(ROWNUM+1)的数据
RANGE BETWEEN CURRENT ROW AND 350 FOLLOWING:指当前行到当前行数据+350的范围内的数据
RANGE BETWEEN 5 PRECEDING AND 5 FOLLOWING:指当前行数据幅度减5加5后的范围内的数据

三、练习:


```bash
DROP TABLE IF EXISTS `test`;
CREATE TABLE `test`  (
  `video_id` int(0) NOT NULL COMMENT '视频ID',
  `dt` date NULL DEFAULT NULL,
  `if_follow` tinyint(0) NULL DEFAULT NULL COMMENT '是否关注'
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic;
 
-- ----------------------------
-- Records of test
-- ----------------------------
INSERT INTO `test` VALUES (2001, '2021-09-24', 1);
INSERT INTO `test` VALUES (2001, '2021-10-03', 9);
INSERT INTO `test` VALUES (2001, '2021-10-02', 2);
INSERT INTO `test` VALUES (2001, '2021-10-01', 6);
INSERT INTO `test` VALUES (2002, '2021-09-25', 1);
INSERT INTO `test` VALUES (2002, '2021-09-25', 1);
INSERT INTO `test` VALUES (2002, '2021-09-26', 6);
INSERT INTO `test` VALUES (2002, '2021-09-27', 1);
INSERT INTO `test` VALUES (2002, '2021-09-28', 1);
INSERT INTO `test` VALUES (2002, '2021-09-29', 8);
INSERT INTO `test` VALUES (2002, '2021-09-30', 7);
INSERT INTO `test` VALUES (2002, '2021-10-01', 1);
INSERT INTO `test` VALUES (2002, '2021-10-02', 9);
INSERT INTO `test` VALUES (2002, '2021-10-03', 1);

range是对order by 的值进行判断范围计算的,根据实际的值和当前的值进行判断取定数据范围的。
#preceding 在…之前
#following 在…之后

select dt,video_id,if_follow, sum(if_follow) over(partition by video_id order by if_follow range between 1 preceding and 1 following) as num from test ;

开窗函数的使用详解(窗口范围ROWS与RANGE图文详解)

#current row 当前行

select video_id,dt,if_follow, sum(if_follow) over(partition by video_id order by if_follow range BETWEEN  CURRENT ROW and  3 following) as num from test ;

开窗函数的使用详解(窗口范围ROWS与RANGE图文详解)

#unbounded preceding 区间的第一行

select video_id,dt,if_follow, sum(if_follow) over(partition by video_id order by if_follow range BETWEEN  unbounded preceding and  3 following) as num from test ;

开窗函数的使用详解(窗口范围ROWS与RANGE图文详解)
#unbounded following 区间的最后一行

select video_id,dt,if_follow, sum(if_follow) over(partition by video_id order by if_follow range BETWEEN  current row and  unbounded following) as num from test ;

开窗函数的使用详解(窗口范围ROWS与RANGE图文详解)
#unbounded preceding and unbounded following 最后一行的值和第一行的值

select video_id,dt,if_follow, sum(if_follow) over(partition by video_id order by if_follow range BETWEEN  unbounded preceding and  unbounded following) as num from test ;

开窗函数的使用详解(窗口范围ROWS与RANGE图文详解)

row是对order by 的值进行判断范围计算的,根据实际的值和当前的值进行判断取定数据范围的
#preceding 在…之前
#following 在…之后

select dt,video_id,if_follow, sum(if_follow) over(partition by video_id order by if_follow rows between 1 preceding and 1 following) as num from test ;

开窗函数的使用详解(窗口范围ROWS与RANGE图文详解)

#current row 当前行

select video_id,dt,if_follow, sum(if_follow) over(partition by video_id order by if_follow rows BETWEEN  CURRENT ROW and  3 following) as num from test ;

开窗函数的使用详解(窗口范围ROWS与RANGE图文详解)
#unbounded preceding 区间的第一行

select video_id,dt,if_follow, sum(if_follow) over(partition by video_id order by if_follow rows BETWEEN  unbounded preceding and  3 following) as num from test ;

开窗函数的使用详解(窗口范围ROWS与RANGE图文详解)
#unbounded following 区间的最后一行

select video_id,dt,if_follow, sum(if_follow) over(partition by video_id order by if_follow rows BETWEEN  current row and  unbounded following) as num from test ;

开窗函数的使用详解(窗口范围ROWS与RANGE图文详解)
#unbounded preceding and unbounded following 最后一行的值和第一行的值

select video_id,dt,if_follow, sum(if_follow) over(partition by video_id order by if_follow rows BETWEEN  unbounded preceding and  unbounded following) as num from test ;

开窗函数的使用详解(窗口范围ROWS与RANGE图文详解)文章来源地址https://www.toymoban.com/news/detail-439742.html

到了这里,关于开窗函数的使用详解(窗口范围ROWS与RANGE图文详解)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • SQL - 开窗(窗口)函数

    开窗函数对一组值进行操作,它不像普通聚合函数那样需要使用GROUP BY子句对数据进行分组,能够在同一行中同时返回基础行的列和聚合列 开窗函数的语法形式为:函数 + over(partition by 分组用列 order by 排序用列),表示对数据集按照分组用列进行分区,并且并且对每个分区按

    2024年02月12日
    浏览(31)
  • 【SQL】MySQL中的窗口函数(开窗函数)

    窗口函数是 MYSQL8.0 新增的 聚合函数: 多行变一行,常见的sum,count,max,min 窗口函数: 行数不变,常见的row_number,rank 语法格式: 窗口函数(表达式) over (partition by … order by … frame_clause) partition by是分区,类似于group by,如去掉相当于对所有数据进行计算 order by排序 frame_c

    2024年02月07日
    浏览(36)
  • MySQL---控制流函数、窗口函数(序号函数、开窗聚合函数、分布函数、前后函数、头尾函数、其他函数)

    格式 解释 案例 IF(expr,v1,v2) 如果表达式 expr 成立,返回结果 v1 ;否则,返回结果 v2 。 SELECT IF(1 0,\\\' 正确 \\\',\\\' 错误 \\\')    - 正确 IFNULL(v1,v2) 如果 v1 的值不为 NULL ,则返回 v1 ,否则返回 v2 。 SELECT IFNULL(null,\\\'Hello Word\\\') -Hello Word ISNULL(expression) 判断表达式是否为 NULL SELECT ISNULL(NUL

    2024年02月04日
    浏览(33)
  • 【大数据之Hive】十六、Hive-HQL函数之窗口函数(开窗函数)

      先定义了窗口的大小(按行来算),然后对窗口内的行的数据进行计算,再将计算结果返回给改行。   窗口函数包括窗口和函数两部分,窗口用于定义计算范围,函数用于定义计算逻辑,窗口函数只会在原来的表上增加一列结果列,不改变原来的数据。 函数:   绝

    2024年02月11日
    浏览(32)
  • ES系列:range范围查询使用举例

    目录 数据范围 时间范围 完整日期方式 字母日期方式 range过滤允许我们按照指定范围查找一批数据

    2024年02月11日
    浏览(48)
  • 【大数据技术】hive 窗口函数sum range between的详细介绍

    【大数据技术】hive 窗口函数sum range between的详细介绍 数据准备 建表 插入数据 查看数据 对比两段sql的不同之处 及其运行结果 结果如下: 第一段 第二段 重点注意: 第一段和第二段sql的rows between与range between的不同 第一段与第二段sql的order by字段有不同 第二段sql最后使用了

    2024年02月13日
    浏览(26)
  • python中的range函数|python中的range函数|range()函数详解|Python中range(len())的用法

    range() 是 Python 内置的一个函数,用于生成一个整数序列。具体来说,它的定义如下: start、stop、step 分别表示序列的起始值、终止值和步长。start 和 step 是可选参数,如果不指定则默认为 0 和 1。 当只传入一个参数时,表示生成从 0 开始、小于该参数的整数序列。例如: 这

    2024年02月07日
    浏览(47)
  • hivesql开窗函数row number() over (partition by )详解

    ROW_NUMBER() OVER (PARTITION BY ) 是一种窗口函数,用于在每个分区内对行进行编号。它可以用于分析和报表等场景,可以帮助我们对数据进行分组排序,获取排名信息。 具体来说,ROW_NUMBER() 是一种分析函数,它可以根据 ORDER BY 子句中指定的列对行进行排序,并为每个分区内的行分

    2024年02月05日
    浏览(29)
  • hive窗口分析函数使用详解系列二之分组排序窗口函数

    我们讨论面试中各大厂的SQL算法面试题,往往核心考点就在于窗口函数,所以掌握好了窗口函数,面对SQL算法面试往往事半功倍。 已更新第一类聚合函数类,点击这里阅读 hive窗口函数聚合函数类 本节介绍Hive聚合函数中的第二类聚合函数:分组排序窗口函数。 这些函数的用

    2024年04月13日
    浏览(27)
  • SQL窗口分析函数使用详解系列三之偏移量类窗口函数

    本文以HiveSQL语法进行代码演示。 对于其他数据库来说同样也适用,比如SparkSQL,FlinkSQL以及Mysql8,Oracle,SqlServer等传统的关系型数据库。 已更新第一类聚合函数类,点击这里阅读 ①SQL窗口函数系列一之聚合函数类 ②SQL窗口函数系列二之分组排序窗口函数 本节介绍Hive窗口分

    2024年04月26日
    浏览(28)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包