窗口函数(window functions)对多行进行操作,并为查询中的每一行返回一个值。 OVER()子句能将窗口函数与其他分析函数(analytical functions)和报告函数(reporting functions)区分开来。

1. 常用窗口函数

下表列出了一些窗口函数以及描述信息:

窗口函数 描述
LAG() LAG()窗口函数返回分区中当前行之前行(可以指定第几行)的值。 如果没有行,则返回null。
LEAD() LEAD()窗口函数返回分区中当前行后面行(可以指定第几行)的值。 如果没有行,则返回null。
FIRST_VALUE FIRST_VALUE窗口函数返回相对于窗口中第一行的指定列的值。
LAST_VALUE LAST_VALUE窗口函数返回相对于窗口中最后一行的指定列的值。
2. 语法

LAG 和 LEAD 语法

LAG | LEAD
( <col>, <line_num>, <DEFAULT> )
OVER ( [ PARTITION BY ] [ ORDER BY ] )

FIRST_VALUE | LAST_VALUE 语法

FIRST_VALUE | LAST_VALUE
( <col>,<ignore nulls as boolean> ) OVER
( [ PARTITION BY ] [ ORDER BY ][ window_clause ] )

3.demo

原数据:

hive> select * from tmp_pv;
OK
0006D2BC-4DF9-4C0B-83AD-0183789E78D4 2017-02-10 1
0006D2BC-4DF9-4C0B-83AD-0183789E78D4 2017-02-11 5
0006D2BC-4DF9-4C0B-83AD-0183789E78D4 2017-02-12 7
0006D2BC-4DF9-4C0B-83AD-0183789E78D4 2017-02-13 3
0006D2BC-4DF9-4C0B-83AD-0183789E78D4 2017-02-14 2
0006D2BC-4DF9-4C0B-83AD-0183789E78D4 2017-02-15 4
0006D2BC-4DF9-4C0B-83AD-0183789E78D4 2017-02-16 4
993BD7AD-3B62-BA0C-15AE-A14B85921889 2017-02-10 2
993BD7AD-3B62-BA0C-15AE-A14B85921889 2017-02-11 9
993BD7AD-3B62-BA0C-15AE-A14B85921889 2017-02-12 3
993BD7AD-3B62-BA0C-15AE-A14B85921889 2017-02-13 10
993BD7AD-3B62-BA0C-15AE-A14B85921889 2017-02-14 1
993BD7AD-3B62-BA0C-15AE-A14B85921889 2017-02-15 8
993BD7AD-3B62-BA0C-15AE-A14B85921889 2017-02-16 2
Time taken: 0.102 seconds, Fetched: 14 row(s)

3.1 LAG()

LAG(col,n,DEFAULT)窗口函数返回分区中当前行之前第n行对应列的值。 如果没有相应的行,则返回NULL。 第一个参数为列名,第二个参数为当前行之前第n行(可选,默认为1),第三个参数为缺失时默认值(当前行之前第n行为NULL没有时,返回该默认值,如不指定,则为NULL)。

为了比较每个用户浏览次数与前一天的浏览次数进行比较,查询返回当前浏览次数以及前一天的浏览数量。由于在2017-02-10之前没有浏览行为,前一天的浏览次数设置为0(不设置默认为NULL)。

hive> select gid, dt, pv, lag(pv, 1, 0) over (partition by gid order by dt) as pre_pv from tmp_pv;

0006D2BC-4DF9-4C0B-83AD-0183789E78D4    2017-02-10    1    0
0006D2BC-4DF9-4C0B-83AD-0183789E78D4 2017-02-11 5 1
0006D2BC-4DF9-4C0B-83AD-0183789E78D4 2017-02-12 7 5
0006D2BC-4DF9-4C0B-83AD-0183789E78D4 2017-02-13 3 7
0006D2BC-4DF9-4C0B-83AD-0183789E78D4 2017-02-14 2 3
0006D2BC-4DF9-4C0B-83AD-0183789E78D4 2017-02-15 4 2
0006D2BC-4DF9-4C0B-83AD-0183789E78D4 2017-02-16 4 4
993BD7AD-3B62-BA0C-15AE-A14B85921889 2017-02-10 2 0
993BD7AD-3B62-BA0C-15AE-A14B85921889 2017-02-11 9 2
993BD7AD-3B62-BA0C-15AE-A14B85921889 2017-02-12 3 9
993BD7AD-3B62-BA0C-15AE-A14B85921889 2017-02-13 10 3
993BD7AD-3B62-BA0C-15AE-A14B85921889 2017-02-14 1 10
993BD7AD-3B62-BA0C-15AE-A14B85921889 2017-02-15 8 1
993BD7AD-3B62-BA0C-15AE-A14B85921889 2017-02-16 2 8
Time taken: 11.783 seconds, Fetched: 14 row(s)

3.2 LEAD()

LEAD(col,n,DEFAULT)窗口函数返回分区中当前行后面第n行对应列的值。 如果没有相应的行,则返回NULL。 第一个参数为列名,第二个参数为当前行后面第n行(可选,默认为1),第三个参数为缺失时默认值(当前行后面第n行为没有时,返回该默认值,如不指定,则为NULL)。

为了比较每个用户浏览次数与后一天的浏览次数进行比较,查询返回当前浏览次数以及后一天的浏览数量。由于在2017-02-16之后没有浏览行为,后一天的浏览次数显示为NULL(默认为NULL)

hive> select gid, dt, pv, lead(pv, 1) over (partition by gid order by dt) from tmp_pv;

0006D2BC-4DF9-4C0B-83AD-0183789E78D4    2017-02-10    1    5
0006D2BC-4DF9-4C0B-83AD-0183789E78D4 2017-02-11 5 7
0006D2BC-4DF9-4C0B-83AD-0183789E78D4 2017-02-12 7 3
0006D2BC-4DF9-4C0B-83AD-0183789E78D4 2017-02-13 3 2
0006D2BC-4DF9-4C0B-83AD-0183789E78D4 2017-02-14 2 4
0006D2BC-4DF9-4C0B-83AD-0183789E78D4 2017-02-15 4 4
0006D2BC-4DF9-4C0B-83AD-0183789E78D4 2017-02-16 4 NULL
993BD7AD-3B62-BA0C-15AE-A14B85921889 2017-02-10 2 9
993BD7AD-3B62-BA0C-15AE-A14B85921889 2017-02-11 9 3
993BD7AD-3B62-BA0C-15AE-A14B85921889 2017-02-12 3 10
993BD7AD-3B62-BA0C-15AE-A14B85921889 2017-02-13 10 1
993BD7AD-3B62-BA0C-15AE-A14B85921889 2017-02-14 1 8
993BD7AD-3B62-BA0C-15AE-A14B85921889 2017-02-15 8 2
993BD7AD-3B62-BA0C-15AE-A14B85921889 2017-02-16 2 NULL
Time taken: 9.509 seconds, Fetched: 14 row(s)

3.3 FIRST_VALUE()

为了比较每个用户浏览次数与第一天浏览次数进行比较,查询返回当前浏览次数以及第一天浏览次数。第一个用户第一天浏览次数为1,第二个用户第一天浏览次数为2。

hive> select gid, dt, pv, first_value(pv) over (partition by gid order by dt) from tmp_pv;

0006D2BC-4DF9-4C0B-83AD-0183789E78D4    2017-02-10    1     1
0006D2BC-4DF9-4C0B-83AD-0183789E78D4 2017-02-11 5 1
0006D2BC-4DF9-4C0B-83AD-0183789E78D4 2017-02-12 7 1
0006D2BC-4DF9-4C0B-83AD-0183789E78D4 2017-02-13 3 1
0006D2BC-4DF9-4C0B-83AD-0183789E78D4 2017-02-14 2 1
0006D2BC-4DF9-4C0B-83AD-0183789E78D4 2017-02-15 4 1
0006D2BC-4DF9-4C0B-83AD-0183789E78D4 2017-02-16 4 1
993BD7AD-3B62-BA0C-15AE-A14B85921889 2017-02-10 2 2
993BD7AD-3B62-BA0C-15AE-A14B85921889 2017-02-11 9 2
993BD7AD-3B62-BA0C-15AE-A14B85921889 2017-02-12 3 2
993BD7AD-3B62-BA0C-15AE-A14B85921889 2017-02-13 10 2
993BD7AD-3B62-BA0C-15AE-A14B85921889 2017-02-14 1 2
993BD7AD-3B62-BA0C-15AE-A14B85921889 2017-02-15 8 2
993BD7AD-3B62-BA0C-15AE-A14B85921889 2017-02-16 2 2
Time taken: 9.862 seconds, Fetched: 14 row(s)

备注

上面例子窗口为第一行到当前行(缺失window子句有order by ,默认为rows between unbounded preceding and current row)。所以,first_value返回窗口的第一行,即第一天浏览次数。

4.4 LAST_VALUE()

为了比较每个用户浏览次数与最新一天浏览次数进行比较,查询返回当前浏览次数以及最新一天浏览次数。第一个用户最新一天(2017-02-16)浏览次数为4,第二个用户最新一天(2017-02-16)浏览次数为2。

hive> select gid, dt, pv, last_value(pv) over (partition by gid order by dt rows between current row and unbounded following) from tmp_pv;

0006D2BC-4DF9-4C0B-83AD-0183789E78D4    2017-02-10    1    4
0006D2BC-4DF9-4C0B-83AD-0183789E78D4 2017-02-11 5 4
0006D2BC-4DF9-4C0B-83AD-0183789E78D4 2017-02-12 7 4
0006D2BC-4DF9-4C0B-83AD-0183789E78D4 2017-02-13 3 4
0006D2BC-4DF9-4C0B-83AD-0183789E78D4 2017-02-14 2 4
0006D2BC-4DF9-4C0B-83AD-0183789E78D4 2017-02-15 4 4
0006D2BC-4DF9-4C0B-83AD-0183789E78D4 2017-02-16 4 4
993BD7AD-3B62-BA0C-15AE-A14B85921889 2017-02-10 2 2
993BD7AD-3B62-BA0C-15AE-A14B85921889 2017-02-11 9 2
993BD7AD-3B62-BA0C-15AE-A14B85921889 2017-02-12 3 2
993BD7AD-3B62-BA0C-15AE-A14B85921889 2017-02-13 10 2
993BD7AD-3B62-BA0C-15AE-A14B85921889 2017-02-14 1 2
993BD7AD-3B62-BA0C-15AE-A14B85921889 2017-02-15 8 2
993BD7AD-3B62-BA0C-15AE-A14B85921889 2017-02-16 2 2
Time taken: 9.335 seconds, Fetched: 14 row(s)

备注

上面例子的窗口为当前行到最后一行(rows between current row and unbounded following)。last_value返回的是窗口最后一行,即最新一天的浏览次数。

Hive 窗口函数LEAD LAG FIRST_VALUE LAST_VALUE的更多相关文章

  1. hive 取两次记录的时间差 lead lag first_value last_value

    -- LEAD(col,n,DEFAULT) 用于统计窗口内往下第n行值 -- 第一个参数为列名,第二个参数为往下第n行(可选,默认为1),第三个参数为默认值(当往下第n行为NULL时候,取默认值,如 ...

  2. Hive窗口函数之LAG、LEAD、FIRST_VALUE、LAST_VALUE的用法

    一.创建表: create table windows_ss ( polno string, eff_date string, userno string ) ROW FORMAT DELIMITED ...

  3. Hive 窗口函数、分析函数

    1 分析函数:用于等级.百分点.n分片等 Ntile 是Hive很强大的一个分析函数. 可以看成是:它把有序的数据集合 平均分配 到 指定的数量(num)个桶中, 将桶号分配给每一行.如果不能平均分配 ...

  4. hive窗口函数/分析函数详细剖析

    hive窗口函数/分析函数 在sql中有一类函数叫做聚合函数,例如sum().avg().max()等等,这类函数可以将多行数据按照规则聚集为一行,一般来讲聚集后的行数是要少于聚集前的行数的.但是有时 ...

  5. Hive窗口函数保姆级教程

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

  6. Hive 窗口函数

    举例: row_number() over(partition by clue_id order by state_updated desc) 业务举例: select distinct a.clue ...

  7. Hive 窗口函数sum() over()求当前行和前面n条数据的和

    前几天遇到一个这样的需求:销售总占比加起来超过75%的top分类.具体需求是这样的:商品一级分类标签下面有许多商品标签,例如运动户外一级标签,下面可能存在361°,CBA,Nike,Adidas... ...

  8. oracle函数中lead,lag,over,partition by 的使用

    lead,lag函数的分析 http://blog.csdn.net/mazongqiang/article/details/7621328 举例如下: SQL> select *  from ...

  9. Hive学习之路 (十六)Hive分析窗口函数(四) LAG、LEAD、FIRST_VALUE和LAST_VALUE

    数据准备 数据格式 cookie4.txt cookie1, ::,url2 cookie1, ::,url1 cookie1, ::,1url3 cookie1, ::,url6 cookie1, ...

随机推荐

  1. Linux环境Nginx安装

    开始前,请确认gcc g++开发类库是否装好,默认已经安装. ububtu平台编译环境可以使用以下指令 apt-get install build-essential apt-get install ...

  2. Install the Flash plug-in

    Flash is a plug-in for your web browser that allows you to watch videos and use interactive web page ...

  3. [LeetCode] 373. Find K Pairs with Smallest Sums 找和最小的K对数字

    You are given two integer arrays nums1 and nums2 sorted in ascending order and an integer k. Define ...

  4. RTX系统整合记录

    1.切换数据库RTX常见问题解答五. SQL数据库配置 2.同步系统组织机构 部门同步 用户同步https://blog.csdn.net/qq_21703215/article/details/80 ...

  5. java:(九大内置对象,计算服务器访问次数,filter过滤器,MVC框架,MVC和三层架构的关系)

    1.九大内置对象: <%@ page language="java" import="java.util.*" pageEncoding="UT ...

  6. kettle 连接 mysql8.0 报错的解决办法 org.pentaho.di.core.exception.KettleDatabaseException: Error occurred while trying to connect to the database Error connecting to database: (using class org.gjt.mm.mysql.

    1.下载 mysql8.0 驱动放到 如下目录中 mysql8.0以上的驱动下载链接:mysql-connet-8.0.13 2.配置你连接的数据库 找到如下文件打开编辑 连接信息:下面是我本地的配置 ...

  7. Junit4 简单使用

    一.环境搭建 对于习惯使用Eclipse开发平台来说,Junit早已是非常通常的插件,在Eclipse开发平台中,可以非常方便地搭建Junit测试环境. 1.在Eclipse上创建工程,任何Java工 ...

  8. (5.1.5)引擎管理——多服务器管理之中央管理服务器(CMS)

    关键词:中央管理服务器,CMS,多服务器管理 中央管理服务器 -[1]打开 视图->已注册的服务器 [2]注册中央管理服务器 右击中央管理器->注册中央管理服务器 这里输入IP.主机名都可 ...

  9. keepalived 容器在宿主机重启后无法启动问题:报错:daemon is already running

    初步猜测原因是:keepalived容器内的keepalived.pid文件在keepalived容器非正常退出时,没有正确删除,造成第二次启动时容器检查到pid文件已经存在,认为该进程已经存在,因为 ...

  10. <form:select>

    <form:select path="classification" class="input-medium"> <form:option v ...