首页 > 数据库 >HIVE SQL 聚合函数与 rows between / range between详解

HIVE SQL 聚合函数与 rows between / range between详解

时间:2024-04-27 15:55:27浏览次数:25  
标签:BETWEEN rows UNBOUNDED PRECEDING between RANGE SQL FOLLOWING 排序

HIVE SQL 聚合函数与 rows between / range between详解

名词解释

unbounded:无边界
preceding:根据排序后的结果集选定的当前数据行往前
following:根据排序后的结果集选定的当前数据行往后
unbounded preceding:根据排序后的结果集选定的当前数据行往前,即到初始行结束
n preceding:往前n行,需要结合参数ROWS和RANGE的不同,所属含义将会有所不同
unbounded following:根据排序后的结果集选定的当前数据行往后,即到末尾行结束
n following 往后n行,需要结合参数ROWS和RANGE的不同,所属含义将会有所不同
current row 当前行

语法
(ROWS | RANGE) BETWEEN (UNBOUNDED | [num]) PRECEDING AND ([num] PRECEDING | CURRENT ROW | (UNBOUNDED | [num]) FOLLOWING)
(ROWS | RANGE) BETWEEN CURRENT ROW AND (CURRENT ROW | (UNBOUNDED | [num]) FOLLOWING)

区别

ROWS BETWEEN 3 PRECEDING AND 4 FOLLOWING:表示在当前顺序的前提下,往前3行数据和往后4行数据,总计8行,当然这个8行不是绝对的,比如排序后的第一条数据亦或排序后的最后一条数据,根据行数判定肯定不会是8行。这个可以理解为物理行数。

RANGE BETWEEN 3 PRECEDING AND 4 FOLLOWING:表示在当前顺序的前提下,当前的数值进行加减的一个范围。比如我是以年龄进行排序,当前的记录为5岁,那么实际取值的范围是[2,9]之间的所有数据,这里可能根据数据情况的情况不止8条数据哦,可多可少。这个可以理解为逻辑行数。

举例

  1. RANGE BETWEEN UNBOUNDED FOLLOWING AND UNBOUNDED FOLLOWING【此句为默认,在开窗时不添加也是默认有】

    sum(score) over ()

    同:sum(score) over (order by datetimes RANGE BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING)

  2. 互联网行业的活跃用户语境用法

    场景:在同一个月中存在15天登录行为的客户为活跃用户:

    count(distinct datetimes) over (order by datetimes RANGE BETWEEN 7 PRECEDING AND 7 FOLLOWING)

    datetimes为时间字段,在使用该方法前,需将其转化为yyyyMMdd且将其转换为数值类型,方可进行使用。因为他需要同代码中的7进行加减,否则会报错。

    前7后7:当前时间datetimes减7和加7。例如:20240415是当前这条记录的时间,那么根据range的规则需要在此范围内[20240408,20240422]这个闭区间内的数据进行计算。【需要留意的是数字这块必须要大于0的正整数,0已经有CURRENT ROW契合】

  3. 计分领域的语境用法,实际就是以某一顺序维度做累加

    场景:篮球场上在不同时段,各队总比分的场景。一般而言某队得分都会插入一条数据

    其中某队的得分计算法

    sum(score) over (order by datetimes ROWS BETWEEN UNBOUNDED FOLLOWING AND CURRENT ROW)

    以时间为维度进行顺序排序,而后通过锁定当前行【CURRENT ROW】时间线往前推的所有记录【UNBOUNDED FOLLOWING】的得分【score】进行累加

标签:BETWEEN,rows,UNBOUNDED,PRECEDING,between,RANGE,SQL,FOLLOWING,排序
From: https://www.cnblogs.com/tobeeasyman/p/18162154

相关文章

  • MySQL LIMIT 和 ORDER BY 优化
     MySQLLIMIT子句MySQLLIMIT子句是控制SELECT语句返回行数的重要工具。通过指定从结果集中获取的最大行数,它可以让你处理数据子集,尤其是在涉及大表的情况下。该功能可提高查询性能,并通过只获取必要的行来优化资源使用。 MySQLLIMIT子句的语法MySQL中的LIMIT子句......
  • MySQL学习之explain
     from之后的查询得到的表叫做衍生表,是临时表数据,生成临时表之后的数据是无法使用索引的,如果数据量大查询效率就会比较低,这就是查询要尽量少使用子查询这些临时表。  explain详解id:表示查询序号,也可以表示优先级;当值都不一样的时候,值越大表示优先级越高,越先执行;当值都一......
  • 深入mysql索引
    1.索引索引是对数据库表中一列或多列的值进行排序的一种结构。 MySQL索引的建立对于MySQL的高效运行是很重要的,索引可以大大提高MySQL的检索速度。索引只是提高效率的一个因素,如果你的MySQL有大数据量的表,就需要花时间研究建立最优秀的索引,或优化查询语句。简单类比一下,数据库......
  • ​​SQL基础 AUTO_INCREMENT 字段​​
    我们通常希望在每次插入新记录时自动创建主键字段的值。​​Auto-increment会在新记录插入表中时生成一个唯一的数字。​​我们可以在表中创建一个自动增量(auto-increment)字段。​ ​​用于MySQL的语法​​​以下SQL语句将"Persons"表中的“ID”列定义为自动递增(auto-inc......
  • SQL217 对所有员工的薪水按照salary降序进行1-N的排名
    示例:droptableifexists`salaries`;CREATETABLE`salaries`(`emp_no`int(11)NOTNULL,`salary`int(11)NOTNULL,`from_date`dateNOTNULL,`to_date`dateNOTNULL,PRIMARYKEY(`emp_no`,`from_date`));INSERTINTOsalariesVALUES(10001,88958,'2......
  • 从海量数据表中筛选符合不同条件组合的数据的SQL优化
    速度很慢的SQL脚本SETNOCOUNTON;DECLARE@snVARCHAR(200);DECLARE@nINT;DECLARE@sn_tabTABLE(idBIGINT,snVARCHAR(200));IFOBJECT_ID('tempdb..#tab_f1')ISNOTNULLDROPTABLE#tab_f1CREATETABLE#tab_f1(idBIGINT)CREATEINDEXidx_f1_id......
  • MySQL Group Replication
    MySQL组复制              在MySQL复制集的基础上,将服务器划分为逻辑组,每组一个复制集。单主模式可以说是主从复制集的替代品,在主从复制集的基础上提供了部分自动化功能,他可以提供:1.复制集启动时自动选主,不需要手动指定2.主......
  • mybatisplus乐观锁实现批量更新(在sql中实现)
    mybatisplus乐观锁实现批量更新在MyBatis-Plus中,乐观锁通常用于处理并发更新数据的问题。乐观锁实现批量更新时,可以使用版本号或者时间戳来保证数据的一致性。以下是使用乐观锁实现批量更新的示例代码:首先,在你的实体类中添加版本号字段:importcom.baomidou.mybatis......
  • SQL窗口分析函数使用详解系列三之偏移量类窗口函数
    1.综述本文以HiveSQL语法进行代码演示。对于其他数据库来说同样也适用,比如SparkSQL,FlinkSQL以及Mysql8,Oracle,SqlServer等传统的关系型数据库。已更新第一类聚合函数类,点击这里阅读①SQL窗口函数系列一之聚合函数类②SQL窗口函数系列二之分组排序窗口函数本节介绍Hive窗口分......
  • 利用python将沪深300股票历史数据存储在sqlite3
    一、环境准备1、python3中自带了sqlite3参考https://www.runoob.com/sqlite/sqlite-tutorial.html2、在sqlite中建表CREATETABLE[stock]([id]NVARCHAR(48),[name]NVARCHAR(24), [code]NVARCHAR(24),[date]INTEGERNOTNULL,[open]REAL,[close]......