快过年了,总算没那么忙了,可以完善一下这篇文章了。之前只能说是备忘罢了,很多细节没说清楚。

首先,我们要知道什么是窗口子句:

需要指定一个窗口的边界,语法是这样的:

ROWS betweenCURRENT ROW | UNBOUNDED PRECEDING | [num] PRECEDING AND  UNBOUNDED FOLLOWING | [num] FOLLOWING| CURRENT ROW

RANGE between [num] PRECEDING  AND [num]FOLLOWING

如下图:

ROWS是物理窗口,从行数上控制窗口的尺寸的;

RANGE是逻辑窗口,从列值上控制窗口的尺寸。这个比较难理解,但说白了就简单了,具体解释如下面栗子1.

结合order by子句使用,如果在order by子句后面没有指定窗口子句,则默认为:range between unbounded preceding and current row

------------------------------------------------------------

rt_data表存放了当天每半小时的店铺销售数据

字段stat_date格式yyMMddHHmm

------------------------------------------------------------

1.统计截止到当前时间段的店铺累计销售金额

select shop_id, stat_date, ordamt, sum(ordamt) over(partition by shop_id order by stat_date)
from rt_data
where dt = '2015-01-11' and shop_id = 10026;10026   201501120030    5170    5170
10026   201501120100    5669    10839
10026   201501120130    2396    13235
10026   201501120200    1498    14733
10026   201501120230    1997    16730
10026   201501120300    1188    17918
10026   201501120330    598 18516
10026   201501120400    479 18995
10026   201501120430    1587    20582
10026   201501120530    799 21381

这里order by 后面省去了窗口子句,还原起来就是order by stat_date range between unbounded preceding and current row. 这是什么意思?

就是先按stat_date排序,窗口就是比当前stat_date小的行到当前stat_date的行。

其实,这里写成order by stat_date rows between unbounded preceding and current row是一样的。

2.统计每个时间段的销售占比

select shop_id, stat_date, ordamt, ordamt / sum(ordamt) over(partition by shop_id)
from rt_data
where dt = '2015-01-11' and shop_id = 10026
order by stat_date;10026    201501120900    5406    0.014227
10026   201501120930    13098   0.034471
10026   201501121000    15679   0.041263
10026   201501121030    12134   0.031934
10026   201501121100    26259   0.069107
10026   201501121130    16516   0.043466
10026   201501121200    20127   0.052969

partition by之后没有使用order by,窗口大小默认就是整个分组。

3.找出2点的销售金额及前半小时的销售金额和后1个小时的销售金额

select * from ( select shop_id, stat_date,ordamt, lag(stat_date,1) over(partition by shop_id order by stat_date), lag(ordamt,1) over(partition by shop_id order by stat_date), lead(stat_date,2) over(partition by shop_id order by stat_date),lead(ordamt,2) over(partition by shop_id order by stat_date) from rt_data where dt = '2015-01-11' and shop_id = 10026
) t
where stat_date = 201501120200;10026   201501120200    1498    201501120130    2396    201501120300    1188

lag(field, N)是取前N行的值,lead(field, N)是取后N行的值。

4.按照销售金额进行排名,金额最大的排最前(limit可以取topn的数)

select shop_id, stat_date, ordamt, dense_rank() over(partition by shop_id order by ordamt desc)
from rt_data
where dt = '2015-01-11' and shop_id = 10026;10026   201501121100    26259.0 1
10026   201501121200    20127.0 2
10026   201501121300    18138.0 3
10026   201501121130    16516.0 4
10026   201501121400    15956.0 5
10026   201501121000    15679.0 6
10026   201501122200    14290.0 7
10026   201501121430    14203.0 8
10026   201501121330    13290.0 9
10026   201501120930    13098.0 10

dense_rank和rank都是排名函数,区别在于dense_rank是连续排名,rank遇到排名并列时,下一列排名跳空。

percent_rank,介于0和1直接的小数形式表示,计算方法是(rank - 1) / (n-1),其中rank为行的序号,n为组的行数,这个暂时不知道有什么地方可以运用,欢迎指导。

5.按销售金额排序,取出前20%的时间段和相应金额

select * from (select shop_id, stat_date, ordamt, ntile(5) over(partition by shop_id order by ordamt desc) sorted from rt_data where dt = '2015-01-11' and shop_id = 10026
) t
where sorted = 1;10026 201501121100    26259.0 1
10026   201501121200    20127.0 1
10026   201501121300    18138.0 1
10026   201501121130    16516.0 1
10026   201501121400    15956.0 1
10026   201501121000    15679.0 1
10026   201501122200    14290.0 1
10026   201501121430    14203.0 1
10026   201501121330    13290.0 1

NTILE这个很强大,以前要获取一定比例的数据是非常困难的,NTILE就是把有序分区中的行分发到指定数据的组中,各个组有编号,编号从1开始,对于每一行,NTILE返回此行所属的组的编号。

---------------------------------------------------------------------

over语句还可以独立出来,用window重写,但需要注意的是,如下sort by使用了多个字段,如果用range指定窗口的话会出错,需要用rows来指定窗口,因为range是对列的比较,不支持多列比较。

select shop_id, stat_date, ordamt, sum(ordamt) over win as t
from rt_data
where dt = '2015-01-11' and shop_id = 10026
window win as (distribute by shop_id sort by shop_id, ordamt desc rows between unbounded preceding and current row);

hive之窗口函数理解与实践相关推荐

  1. Hive分析窗口函数(一) SUM,AVG,MIN,MAX

    Hive分析窗口函数(一) SUM,AVG,MIN,MAX Hive分析窗口函数(一) SUM,AVG,MIN,MAX Hive中提供了越来越多的分析函数,用于完成负责的统计分析.抽时间将所有的分析窗 ...

  2. Hive分析窗口函数系列文章

    分析窗口函数应用场景: (1)用于分区排序 (2)动态Group By (3)Top N (4)累计计算 (5)层次查询 Hive分析窗口函数(一) SUM,AVG,MIN,MAX Hive中提供了越 ...

  3. Hive分析窗口函数(五) GROUPING SETS,GROUPING__ID,CUBE,ROLLUP

    GROUPING SETS 该关键字可以实现同一数据集的多重group by操作.事实上GROUPING SETS是多个GROUP BY进行UNION ALL操作的简单表达,它仅仅使用一个stage完 ...

  4. HIVE:窗口函数,用sql语句查询MySQL安装路径和版本

    数据大师: Jmx's Blog | Keep it Simple and Stupid! 猴子 - 知乎公众号(猴子数据分析)著有畅销书<数据分析思维>科普中国专家 回答数 647,获得 ...

  5. hive的进一步理解

    目录 HIVE的基本理解,使用,特性 什么是hive hive元数据 hive默认分隔符   \001 hive行级更新操作的前提条件 hive/mysql/hbase比较 函数 hive解决word ...

  6. Hive分析窗口函数

    分析窗口函数应用场景: (1)用于分区排序 (2)动态Group By (3)Top N (4)累计计算 (5)层次查询 Hive分析窗口函数(一) SUM,AVG,MIN,MAX Hive中提供了越 ...

  7. OWIN的理解和实践(三) –Middleware开发入门

    原文:OWIN的理解和实践(三) –Middleware开发入门 上篇我们谈了Host和Server的建立,但Host和Server无法产出任何有实际意义的内容,真正的内容来自于加载于Server的M ...

  8. 广告点击率(CTR)预测经典模型 GBDT + LR 理解与实践(附数据 + 代码)

    CTR 系列文章: 广告点击率(CTR)预测经典模型 GBDT + LR 理解与实践(附数据 + 代码) CTR经典模型串讲:FM / FFM / 双线性 FFM 相关推导与理解 CTR深度学习模型之 ...

  9. 对GCD的一些理解和实践

    对GCD的一些理解和实践 GCD GCD,全程Grand Central Dispatch,是苹果为了多核并行提出的解决方案.它是使用C语言实现,但是由于用了block来处理回调,所以使用起来十分方便 ...

最新文章

  1. 客户端 获取服务器性能,客户端数量 服务器性能
  2. 数据结构:二叉查找树(C语言实现)
  3. 会计专业领域计算机应用系统,信息技术在会计专业领域中的应用
  4. WPF数据驱动应用程序上具有通用Lambda表达式的筛选器模式
  5. php和python-现在自学php和python那个合适?
  6. [外挂1] MFC 鼠标位置设置
  7. LeetCode每日一题——两数相加
  8. Spring MVC JSON自己定义类型转换
  9. UCHOME出现问题(转帖)
  10. 【系列三之CentOS系列】Shell编程入门(3)
  11. springboot使用j2cache
  12. UVM寄存器模型:reg adapter实现和集成
  13. 软件开发工程师招聘笔试题面试题223套和招聘考察内容
  14. Node的老大难问题:require和import
  15. JS案例学习——随机点名案例
  16. 使用京东云免费云主机搭建CentOS
  17. python如何从txt文件中解析出有效的数据
  18. 8.1 子模块分析之IDMAC
  19. Android音频管理器AudioManager用法
  20. Windows2012的VPN服务与测试

热门文章

  1. Python可以用来做什么?
  2. 使用Matlab SPM12与MRIcroGL进行头核磁ROI的标准化与Overlap图的制作
  3. delphi bde mysql_Delphi- 连接MySQL数据库BDE
  4. 位运算符和位运算(与,或,异或等)
  5. 目前市场上最好用的时序数据库是什么?
  6. IOS性能调优系列:使用Zombies动态分析内存中的僵尸对象
  7. FPGA 20个例程篇:11.USB2.0接收并回复CRC16位校验
  8. 页面刷新数据丢失解决方案
  9. vscode 运行C++
  10. 一些常用技术文档网站