首页 > 其他分享 >【Hive】窗口函数

【Hive】窗口函数

时间:2023-06-08 23:01:43浏览次数:44  
标签:pv 函数 -- over partition Hive cookieid 窗口 order


窗口函数介绍:

概述:

窗口函数指的是 over()函数, 它可以结合特定的函数一起使用, 完成不同的功能. ​ 目的/作用: ​ 窗口函数 = 给表新增一列, 至于新增的内容是什么, 取决于窗口函数和什么函数一起使用.

格式:

能和窗口函数一起使用的函数 over(partition by 分组字段 order by 排序字段 rows between 起始行 and 结束行) ​ 能和窗口函数一起使用的函数解释:

聚合函数: count(), sum(), max(), min(), avg() 排序函数: row_number(), rank(), dense_rank(), ntile() 其它函数: lag(), lead(), first_value(), last_value()

这里要注意ntile函数ntiile( 3 )—>表示分成3份

细节:

       1. 窗口函数相当于给表新增一列, 至于新增的内容是什么, 取决于窗口函数和什么函数一起使用.
      2. 如果不写partition by, 表示: 统计表中所有的数据, 如果写了表示统计组内所有的数据.
      3. 如果不写order by, 表示: 统计组内所有的数据, 如果写列, 表示统计组内第一行截止到当前行的数据.
      4. rows between表示统计的范围, 它可以写的关键字如下:
      unbounded preceding   第一行
      unbounded following   最后一行
      n preceding           向上几行
      n following           向下几行
      current row           当前行
      5. ntile(数字)表示几分之几, 里边的数字表示把数据分成几份, 如果不够分, 优先参考最小分区.
      例如: 7条数据分成3份, 则最终结果为: 1, 1, 1   2, 2   3, 3

排序函数区别

row_number(), rank(), dense_rank()
-- 例如: 数据是100, 90, 90, 60, 则: row_number是: 1, 2, 3, 4, rank: 1, 2, 2, 4, dense_rank: 1, 2, 2, 3

与聚合函数结合

数据源我放到度盘

--  细节: 如果写了partition by(表示分组): 则默认操作 组内所有的数据.
select
  cookieid,
  sum(pv) over (partition by cookieid)
from website_pv_info;
-- 细节: 如果写了order by(表示排序):     则默认操作 组内第一行 至 当前行的数据.
select
  *,
  sum(pv) over (partition by cookieid order by createtime)
from website_pv_info;
-- 上述的代码, 等价于如下的内容:
select
  *,
  sum(pv) over (partition by cookieid order by createtime rows between unbounded preceding and current row )
from website_pv_info;

-- 需求: 统计每个cookieID的pv(访问量), 只统计: 当前行及 向前3行 向后1行
select
  *,
  sum(pv) over (partition by cookieid order by createtime rows between  3 preceding and 1 following)
from website_pv_info;

与排序函数结合

金典案例

with a1 as ( select *,
  row_number() over (partition by cookieid order by pv) as row4  -- 根据cookieid分组,按照pv进行排序
from website_pv_info )
select * from a1 where row4<=4;
with a1 as ( select
  *,
  ntile(3) over (partition by cookieid order by pv) as nt
from website_pv_info )
select * from a1 where nt=1;
--  需求: 根据点击量(pv)做排名, 组内排名.
-- 这里的排序函数指的是: row_number(), rank(), dense_rank(), 它们都可以做排名, 不同的是, 对相同值的处理结果.
-- 例如: 数据是100, 90, 90, 60, 则: row_number是: 1, 2, 3, 4, rank: 1, 2, 2, 4, dense_rank: 1, 2, 2, 3
select
      *,
      row_number() over (partition by cookieid order by pv desc) rn,
      rank() over (partition by cookieid order by pv desc) rk,
      dense_rank() over (partition by cookieid order by pv desc) drk
from website_pv_info;

-- 需求: 根据cookieID进行分组, 获取每组点击量最高的前4名数据, 这个就是经典的案例: 分组求TopN
-- Step1: 根据cookieID进行分组, 根据点击量进行排名.
select
      *,
      dense_rank() over (partition by cookieid order by pv desc) drk
from website_pv_info where drk <= 4;        -- 报错.
-- 细节: where只能筛选表中已经有的列(数据)
-- Step2: 把上述的查询结果当做一张表, 然后从中获取我们要的数据即可.
with t1 as (
   select
      *,
      dense_rank() over (partition by cookieid order by pv desc) drk
   from website_pv_info
)
select * from t1 where drk <= 4;

-- ntile(数字,表示分成几份) 采用均分策略, 每份之间的差值不超过1, 优先参考最小的那个部分, 即: 7分成3份, 则是: 3, 2, 2
select
      *,
      ntile(3) over (partition by cookieid order by pv desc) nt
from website_pv_info;


-- 需求: 按照cookieid分组, 按照点击量降序排列, 只要每组前三分之一的数据.
with t1 as (
   select
          *,
          ntile(3) over (partition by cookieid order by pv desc) nt
   from website_pv_info
)
select * from t1 where nt = 1;

select * from website_pv_info;

与其他函数结合

--  1. LAG 用于统计窗口内往上第n行值
-- 需求: 显示用户上一次的访问时间, 格式: lag(字段, n, 默认值) 向上获取字段的第n个值, 如果没有写写默认值, 找不到就是null, 如果写了默认值, 找不到就用默认值.
select
      *,
      -- 向上1个, 找到就显示, 找不到就显示为 null
      lag(createtime) over(partition by cookieid order by createtime) `lag1`,
      -- 向上2个, 找到就显示, 找不到就用默认值: '2023-05-20 10:52:05'
      lag(createtime, 2, '2023-05-20 10:52:05') over(partition by cookieid order by createtime) `lag2`
from website_url_info;

-- 根据cookieID分组, createtime升序排序, 获取当前行 向上2行的createtime列的值, 找不到就用默认值(夯哥)填充.

-- 2. LEAD 用于统计窗口内往下第n行值
select
      *,
      lead(createtime) over(partition by cookieid order by createtime) `lead1`,
      lead(createtime, 2, '夯哥') over(partition by cookieid order by createtime) `lead2`
from website_url_info;

-- 3. FIRST_VALUE 取分组内排序后,截止到当前行,第一个值
select
      *,
      first_value(createtime) over(partition by cookieid order by createtime) `first_value`
from website_url_info;

-- 4. LAST_VALUE 取分组内排序后,截止到当前行,最后一个值
select
      *,
      last_value(createtime) over(partition by cookieid order by createtime) `last_value`
from website_url_info;

标签:pv,函数,--,over,partition,Hive,cookieid,窗口,order
From: https://www.cnblogs.com/liam-sliversucks/p/17467914.html

相关文章

  • 14dayPythonTask7-类与对象+魔法函数
    目录类与对象1.对象=属性+方法2.self是什么?3.Python的魔法方法4.公有和私有5.继承6.组合7.类、类对象和实例对象8.什么是绑定?9.一些相关的内置函数(BIF)练习题魔法方法1.基本的魔法方法2.算术运算符3.反算术运算符4.增量赋值运算符5.一元运算符6.属性访问7.描......
  • python常用函数(zip,map,filter,reduce)
    一、zip它是Python的内建函数,(与序列有关的内建函数有:sorted()、reversed()、enumerate()、zip()),其中sorted()和zip()返回一个序列(列表)对象,reversed()、enumerate()返回一个迭代器(类似序列)>>>name=('jack','man','sony','pcky')>>>age=(2001,2003,2005,......
  • 函数
    字符串函数 数值函数 通过数据库函数生成六位随机验证码selectlpad(round(rand()*1000000,0),6,‘0’)日期函数 查询所有员工的入职天数并根据入职天数倒序排序selectname,datediff(curdate(),entrydate)fromemporderbyentrydatedesc;流程函数 if......
  • (转)窗口间的关系与交互(二)
    前一篇讲了窗口间的关系,下面来谈谈怎么交互。说到底很简单,找到了所需要交互的窗口,就像访问本窗口内的对象来访问目标窗口内的变量、函数、 或html对象等。当然也要举个例子。 a.htm:<!DOCTYPEhtmlPUBLIC"-//W3C//DTDXHTML1.0Transitional//EN""http://www.w3.org/TR/xhtml......
  • (转)iframe窗口间的关系及交互(一)
    1.window.parent        当前窗口的上一级窗口,当前窗口可以是在iframe中或是frameset的一个frame中2.window.top  当前窗口的最顶级窗口。  不管当前窗口是嵌了多少层或是通过iframe或是frame嵌套,window.top将返回最外层窗口。 说明:如果当前窗口不在iframe......
  • MATLAB匿名函数解析
    在MATLAB中,匿名函数也被称为内联函数。它是一种无需用户定义的短小的函数表达式,通常用于一次性的简单计算。创建一个匿名函数可以使用以下语法:function_handle=@(input_arguments)expression这里的function_handle是一个指向函数的句柄,input_arguments是一个输入参数列表,而......
  • c语言函数
    #include<iostream>floataverage();//主函数在前需要申明intmain(){floatx;x=average();printf("平均值为:%5.2f\n",x);return0;}floataverage(){floatx1,x2,x3,x4,x5;printf("请输入五个数:");scanf_s(&quo......
  • Oracle聚合函数RANK和dense_rank的使用
    聚合函数RANK和dense_rank主要的功能是计算一组数值中的排序值。在9i版本之前,只有分析功能(analytic),即从一个查询结果中计算每一行的排序值,是基于order_by_clause子句中的value_exprs指定字段的。其语法为:RANK()OVER([query_partition_clause]ord......
  • 非线性规划凸优化——凸函数、凸规划(二)
    凸规划是指若最优化问题的目标函数为凸函数,不等式约束函数也为凸函数,等式约束函数是仿射的。凸规划的可行域为凸集,因而凸规划的局部最优解就是它的全局最优解。当凸规划的目标函数为严格凸函数时,若存在最优解,则这个最优解一定是唯一的最优解。一、凸集凸集:设\(C\)为\(n\)维欧式......
  • 用Mathematica和SciPy阐明Jacobi椭圆函数的定义方法
    这,这个,那,那个Jacobi椭圆函数SN和CN类似于三角函数正弦和余弦。它们出现在非线性振动和保形映射等应用中。不幸的是,定义这些函数有多种约定。这篇文章的目的是澄清围绕这些不同公约的混淆。上面的图像是函数sn[1]的一个图。模量、参数和模数角Jacobi函数有两个输入。我们通常认为Jac......