前几天遇到一个这样的需求:销售总占比加起来超过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条数据的和的更多相关文章

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

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

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

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

  3. Hive窗口函数最全案例详解

    语法: 分析函数 over(partition by 列名 order by 列名 rows between 开始位置 and 结束位置) 常用分析函数: 聚合类 avg().sum().max(). ...

  4. Hive窗口函数案例详解

    语法: 分析函数 over(partition by 列名 order by 列名 rows between 开始位置 and 结束位置) 常用分析函数: 聚合类 avg().sum().max(). ...

  5. Sqoop是一款开源的工具,主要用于在HADOOP(Hive)与传统的数据库(mysql、oracle...)间进行数据的传递

    http://niuzhenxin.iteye.com/blog/1706203   Sqoop是一款开源的工具,主要用于在HADOOP(Hive)与传统的数据库(mysql.postgresql.. ...

  6. Hive 组内计无重复数,追加每条记录后面

    今天无意中碰到一个很简单的计算逻辑,但是用hive想了一大会才实现. 示例表数据: 需求逻辑: 给每条记录追加一个字段,用于统计按照p1和p2字段分组后,每个组中的num的数目(去重后的count). ...

  7. nvl(sum(字段),0) 的时候,能展示数据0,但是group by 下某个伪列的时候,查不到数据(转载)

    今天碰到一个比较有疑惑的问题,就是在统计和的时候,我们往往有时候查不到数据,都会再加个 nvl(sum(字段),0) 来显示这个字段,但是如果我们再加个group by ,就算有加入这个 nvl(nu ...

  8. JS求多个数组的重复数据

    今天朋友问了我这个问题:JS求多个数组的重复数据 注: 1.更准确的说是只要多个数组中有两个以上的重复数据,那么这个数据就是我需要的 2.单个数组内的数据不存在重复值(当然如果有的话,你可以去重) 3 ...

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

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

随机推荐

  1. 设置Anaconda启动jupyter的默认目录

    要解决的问题:安装好Anaconda后打开jupyter总是会自动跳到c:下的用户目录,通过以下方法可以修改其默认打开的目录 吐槽:竟然没有设置默认打开目录的选项,只能通过修改配置文件完成,让人不爽. ...

  2. 【转】Python进度条tqdm的使用

    有时候在使用Python处理比较耗时操作的时候,为了便于观察处理进度,这时候就需要通过进度条将处理情况进行可视化展示,以便我们能够及时了解情况.这对于第三方库非常丰富的Python来说,想要实现这一功 ...

  3. Java多线程_ThreadLocal

    用法:ThreadLocal用于保存某个线程共享变量:对于同一个static ThreadLocal,不同线程只能从中get,set,remove自己的变量,而不会影响其他线程的变量. ThreadL ...

  4. Ajax、XMLHttpRequest、JSONP的区别

    来自2020年搜狗的笔试题,第一题就不会

  5. SEO需要分析哪些网站数据

    http://www.wocaoseo.com/thread-227-1-1.html 一.网站的基本数据 1.网站流量详情(ip.pv.需要看pv与ip的比) 2.网站的跳出率(可以看出一个网站的用 ...

  6. 【原创】探索云计算容器底层之Cgroup

    一.什么是Cgroup,使用场景? 容器本质上是进程,既然是进程就会消耗掉系统资源,比如:CPU.内存.磁盘.网络带宽等,如果不加以限制,容器在某些情况下就会无限制地吃掉宿主机的系统资源,显然这不是我 ...

  7. Python中的协程,为什么说它的底层是生成器?

    我们曾经在golang关于goroutine的文章当中简单介绍过 协程 的概念,我们再来简单review一下.协程又称为是微线程,英文名是Coroutine.它和线程一样可以调度,但是不同的是线程的启 ...

  8. 精华技巧,学会这几招可以假装是Python高手

    Python里面的技巧真的是太多了,菜鸟如何假装自己的是高手呢,下面教大家几招快速变成老司机的招数,尤其是在实战的项目中,用上这几招一定让你周围的同事刮目相看,哇这个代码有两把刷子. 很多人学习pyt ...

  9. Android开发之 当前日期String类型转date类型 java代码中实现方法

    /** * 获取当前时间 * * @return */ public Date getDate(String str) { try { java.text.SimpleDateFormat forma ...

  10. bzoj1590 Secret Message

    Description 贝茜正在领导奶牛们逃跑.为了联络,奶牛们互相发送秘密信息. 信息是二进制的,共有M(1≤M≤50000)条.反间谍能力很强的约翰已经部分拦截了这些信息,知道了第i条二进制信息的 ...