【Hive】 关于开窗函数over()的理解

2021年2月28日 28点热度 0条评论 来源: Harbour_zhang

一、引言

我们都知道在sql中有一类函数叫做聚合函数,例如sum()、avg()、max()等等,这类函数可以将多行数据按照规则聚集为一行,一般来讲聚集后的行数是要少于聚集前的行数的.但是有时我们想要既显示聚集前的数据,又要显示聚集后的数据,这时我们便引入了窗口函数.

二、over() 开窗函数

over() 用于指定分析函数工作的数据窗口大小。

假设有如下数据:

-- 字段名为name,odate,cost, 导入以下数据
jack,2015-01-01,10
jack,2015-01-01,10
tony,2015-01-01,15
jack,2015-02-03,23
tony,2015-01-04,29
jack,2015-04-06,42
mart,2015-04-08,62
mart,2015-04-09,68
mart,2015-04-11,75
mart,2015-04-13,94

我们想要查询 【在 2015 年 4 月份购买过的顾客及总人数】

我们可以写出如下sql语句

select name, count(*) over()
from win
where substr(odate,1,7) = '2015-04'
group by name;

-- 结果为
mart    2
jack    2

而不带over() 的查询语句,则是另一种结果

select name, count(*) 
from win
where substr(odate,1,7) = '2015-04'
group by name;

-- 结果
mart	4
jack	1

三、分析

我们先看看 group by name 以后的数据长什么样。如下图所示。

那么,不带over()的查询语句,与带over的查询语句的区别,如下图所示。

  • count(*) 是将多数据的单元格(例如第二列)作为输入,计算出此单元格的记录条数。
  • over() 函数可以控制计算时的窗口大小。例如,over() 内部无参数时,默认将当前查询的所有结果作为输入
  • 于是,count(*) 计算出的结果为 1,4; count(*) over() 的计算结果为2,2
    原文作者:Harbour_zhang
    原文地址: https://blog.csdn.net/Harbour_zhang/article/details/114209062
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系管理员进行删除。