窗口函数(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. python爬虫常用的库

    1,请求:requests  requests.get(url, headers)  requests.post(url, data=data, files=files)  urllib模块:  Py ...

  2. 老白关于rac性能调优的建议

    RAC应用设计方面需要在底层做很有设计.虽然ORACLE的售前人员总是说RAC的扩展性是透明的,只要把应用分到不同的节点,就可以平滑的扩展系统能力了.而事实上,RAC的CACHE FUSION机制决定 ...

  3. 解决 /usr/lib/x86_64-linux-gnu/liblapack.so.3: undefined reference to `gotoblas'

    最近需要用到openblas库,本地ubuntu 系统内有一个版本,但是想用自己新编译的openblas, 使用cmake指定了链接的库地址, SET(LINK_LIB_DIRS "/usr ...

  4. RTX系统整合记录

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

  5. Tomcat 部署两个工程时,另一个访问出现404

    tomcat下部署两个工程时,只有一个可以访问,另一个出现404错误,该如何解决 在开发新项目的时候,有时候为了省时,直接把曾经做过的项目工程A拷贝成改名为B工程,然后再在B工程上进行功能的开发, 此 ...

  6. 原生js之addEventListener,removeEventListener

    使用addEventListener添加事件 <!DOCTYPE html> <html lang="en"> <head> <meta ...

  7. LeetCode.941-有效山形数组(Valid Mountain Array)

    这是悦乐书的第360次更新,第387篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第222题(顺位题号是941).给定一个整数数组A,当且仅当它是一个有效的山形数组时返回 ...

  8. idea 如何运行maven项目

    1:run→Edit configurations 2:配置tomcat,左边如果没有tomcat server的话,点击 “+”,选择tomcat  server→local,在右边server选项 ...

  9. linux whoami 显示当前用户的用户名

    [root@MongoDB ~]# whoami root

  10. mac os cmake安装

    1.下载安装程序,地址为 http://www.cmake.org/download/,下载 Unix/Linux Source (has \n line feeds) cmake-3.0.2.tar ...