Hive 窗口函数sum() over()求当前行和前面n条数据的和
前几天遇到一个这样的需求:销售总占比加起来超过75%的top分类。具体需求是这样的:商品一级分类标签下面有许多商品标签,例如运动户外一级标签,下面可能存在361°,CBA,Nike,Adidas...等这些商品标签。我们需要统计在一级标签下面占总销售比超过75%的商品标签有哪些,从而让我们了解一级品牌标签下面哪些商品比较收用户喜欢。有以下样例数据(amount_precnt为这类商品在一级标签当中销售占比)。

按照我们的业务需求我们要得到男装->(优衣库,七匹狼) 箱包->(coach) 运动户外->(361°,Nike,CBA)这样的结果就是符合我们的要求。amount_precnt占比在75%的top分类数据。

拿到这样的需求以后,思路如下。按照cat_name分组求和。然后在利用lag函数取前一条求和值作为另外一个字段。最后过滤条件为求和值小于0.5或者当前求和值大于0.5并且前一个求和值小于0.5的数据。得到思路以后主要是卡在了怎么按照cat_name依次求和。就是如何将第一条数据的amount_precnt + 第二条数据的amount_precnt。然后前面两条数据的和在加第三条数据的amount_precnt值。依次这样类推….后面翻看hive 窗口函数的官网得到资料。在sum() over 里面加上 rows between unbounded preceding and current 可以求当前行和前面n条数据的和。我们先看一下sum() over()得到的效果。amount_percent_num的值都是1.就是求和的值。
select amount_percent, cat_name,brand_num,
sum(amount_percent) over(partition by cat_name ) as amount_percent_num
from
(SELECT * FROM hive_temp_bad.dlyang_1234 order by cat_name) t

然后我们加上rows between unbounded preceding and current
select amount_percent, cat_name,brand_num,
sum(amount_percent) over(partition by cat_name ) as amount_percent_num
from
(SELECT * FROM hive_temp_bad.dlyang_1234 order by cat_name) t

得到了我们想要的结果了。最后我们贴上完整的sql代码实现上面功能。
1 select cat_name,brand_num,amount_percent from
2 (select *,lag(amount_percent_num,1,0) over(partition by cat_name order by amount_percent_num) as lag1 from
3 (select amount_percent, cat_name,brand_num,
4 sum(amount_percent) over(partition by cat_name order by amount_percent desc rows between unbounded preceding and current row) as amount_percent_num
5 from
6 (SELECT * FROM hive_temp_bad.dlyang_1234 order by cat_name) t ) t2 ) t3 where lag1 < 0.75 or (amount_percent_num > 0.75 and lag1 < 0.75) ORDER BY
7 cat_name,amount_percent desc;

不得不说sql天花板可能真的是窗口函数了。看来以后得要多多学习了。
Hive 窗口函数sum() over()求当前行和前面n条数据的和的更多相关文章
- Hive窗口函数保姆级教程
在SQL中有一类函数叫做聚合函数,例如sum().avg().max()等等,这类函数可以将多行数据按照规则聚集为一行,一般来讲聚集后的行数是要少于聚集前的行数的.但是有时我们想要既显示聚集前的数据, ...
- hive窗口函数/分析函数详细剖析
hive窗口函数/分析函数 在sql中有一类函数叫做聚合函数,例如sum().avg().max()等等,这类函数可以将多行数据按照规则聚集为一行,一般来讲聚集后的行数是要少于聚集前的行数的.但是有时 ...
- Hive窗口函数最全案例详解
语法: 分析函数 over(partition by 列名 order by 列名 rows between 开始位置 and 结束位置) 常用分析函数: 聚合类 avg().sum().max(). ...
- Hive窗口函数案例详解
语法: 分析函数 over(partition by 列名 order by 列名 rows between 开始位置 and 结束位置) 常用分析函数: 聚合类 avg().sum().max(). ...
- Sqoop是一款开源的工具,主要用于在HADOOP(Hive)与传统的数据库(mysql、oracle...)间进行数据的传递
http://niuzhenxin.iteye.com/blog/1706203 Sqoop是一款开源的工具,主要用于在HADOOP(Hive)与传统的数据库(mysql.postgresql.. ...
- Hive 组内计无重复数,追加每条记录后面
今天无意中碰到一个很简单的计算逻辑,但是用hive想了一大会才实现. 示例表数据: 需求逻辑: 给每条记录追加一个字段,用于统计按照p1和p2字段分组后,每个组中的num的数目(去重后的count). ...
- nvl(sum(字段),0) 的时候,能展示数据0,但是group by 下某个伪列的时候,查不到数据(转载)
今天碰到一个比较有疑惑的问题,就是在统计和的时候,我们往往有时候查不到数据,都会再加个 nvl(sum(字段),0) 来显示这个字段,但是如果我们再加个group by ,就算有加入这个 nvl(nu ...
- JS求多个数组的重复数据
今天朋友问了我这个问题:JS求多个数组的重复数据 注: 1.更准确的说是只要多个数组中有两个以上的重复数据,那么这个数据就是我需要的 2.单个数组内的数据不存在重复值(当然如果有的话,你可以去重) 3 ...
- Hive 窗口函数、分析函数
1 分析函数:用于等级.百分点.n分片等 Ntile 是Hive很强大的一个分析函数. 可以看成是:它把有序的数据集合 平均分配 到 指定的数量(num)个桶中, 将桶号分配给每一行.如果不能平均分配 ...
随机推荐
- CVE-2020-15778 OpenSSH命令注入漏洞复现
一.漏洞概要 OpenSSH 8.3p1及之前版本中的scp允许在scp.c远程功能中注入命令,攻击者可利用该漏洞执行任意命令.目前绝大多数linux系统受影响. 参考链接:https://githu ...
- Go | Go 语言打包静态文件以及如何与Gin一起使用Go-bindata
系列文章目录 第一章 Go 语言打包静态文件以及如何与Gin一起使用Go-bindata 目录 系列文章目录 前言 一.go-bindata是什么? 二.使用步骤 1. 安装 2. 使用 3. 读取文 ...
- (数据科学学习手札94)QGIS+Conda+jupyter玩转Python GIS
本文完整代码及数据已上传至我的Github仓库https://github.com/CNFeffery/DataScienceStudyNotes 1 简介 QGIS随着近些年的发展,得益于其开源免费 ...
- Android自动化测试,5个必备的测试框架
Appium Appium是一个开源的移动测试工具,支持iOS和Android,它可以用来测试任何类型的移动应用(原生.网络和混合).作为一个跨平台的工具,你可以在不同的平台上运行相同的测试.为了实现 ...
- 人到中年的程序员,请提前准备好 Plan B
中年程序员的生存现状已经是老生常谈的话题了,有多老呢?十年前,就有一位名叫"johnfx"的程序员谈过这个话题,并且专门为此写了一篇文章.随着中年程序员生存现状的话题再次成为热点, ...
- windows 下编译libcurl
因为linux平台采用了libcurl,有一个程序移植到到windows平台,再linux采用libcurl.在windows下准备也采用该库.在网上搜索了几位同行写的,步骤上面有缺失. 本文将以详细 ...
- P1082 同余方程(拓展欧几里德)
题目描述 求关于xx的同余方程 a x \equiv 1 \pmod {b}ax≡1(modb) 的最小正整数解. 输入输出格式 输入格式: 一行,包含两个正整数 a,ba,b,用一个空格隔开. 输出 ...
- observeParents的使用
observeParents参数 是布尔类型 默认false 在tab切换选项中有轮播图,切换后轮播图就不播了,并且显示也出现了问题,就可以使用observeParents 用法为 <scri ...
- vue <compent> 结合is实现动态切换子组件
这里就很自然的产生一个新问题:如何给相应的子组件传props?
- 12_Python语法示例(函数)
1.写一个函数mysum,此函数带有两个参数x,y打印出两个参数x,y的和 def mysum(x, y): print(x + y) mysum(3, 2) 2.写一个函数print_even,传入 ...