【hive】分组求排名
分组求排名
- 相信好多使用Mysql的用户一定对分组求排名的需求感到发怵.
- 但是在hive或者oracle来说就能简单实现.
- 采用窗口函数:rank() over() / row_number() over() / dense_rank() over()函数就能轻松完成.
窗口函数
- 我们可以理解为我们先把需要分析的字段select出来,然后通过窗口函数进行分析.
- 所以窗口函数产生的结果一定是一对一的,即便在窗口中使用分组操作产生相同的值也每行数据都有.
示例
select
user_id,user_type,sales, --窗口函数的分析字段
RANK() over (partition by user_type order by sales desc) as rank,
ROW_NUMBER() over (partition by user_type order by sales desc) as row_number,
DENSE_RANK() over (partition by user_type order by sales desc) as dense_rank
from
order_detail;
- 根据窗口函数的理解,我们来看上述例子
- 要分析的字段有 user_type,sales,执行过程对这些字段select出来(可能select不太准确,但是要先取得这些要用于分析的字段)
- 使用窗口函数进行分析 over() 是窗口函数,over()里面一般要写partition by 和 order by来对分析的数据进行分组和排序
- over() 函数前边要定义分析策略,比如 rank(), row_number(),dense_rank()都是不同的分析策略.
结果
user_id | user_type | sales | rank | row_number | dense_rank |
---|---|---|---|---|---|
wutong | new | 6 | 1 | 1 | 1 |
qishili | new | 5 | 2 | 2 | 2 |
lilisi | new | 5 | 2 | 3 | 2 |
wanger | new | 3 | 4 | 4 | 3 |
zhangsa | new | 2 | 5 | 5 | 4 |
qibaqiu | new | 1 | 6 | 6 | 5 |
liiu | new | 1 | 6 | 7 | 5 |
liwei | old | 3 | 1 | 1 | 1 |
wangshi | old | 2 | 2 | 2 | 2 |
lisi | old | 1 | 3 | 3 | 3 |
- 如上述表格,rank() / row_number() / dense_rank() 都是进行排名.
- rank()在处理相同排名的时候根据同排名数据数量进行顺延排名
- dense_rank()在处理相同排名的时候不会顺延排名
- row_number()如函数名,就是单单是排名后的行数
HIVE2.10以后over()函数支持对聚合函数的支持
SELECT rank() OVER (ORDER BY sum(b))
FROM table
GROUP BY a;
上面等于于
SELECT sum_b rank() OVER (ORDER BY sum_b)
FROM(
SELECT SUM(b) AS sum_b
FROM table
GROUP BY a
) t;
【hive】分组求排名的更多相关文章
- Hive - - 分组求最大,最小(加行键)
Hive - - 分组求最大,最小(加行键) 数据: 1325927 陕西 汉中 084 08491325928 陕西 汉中 084 08491325930 陕西 延安 084 08421325931 ...
- hive 分组排序,topN
hive 分组排序,topN 语法格式:row_number() OVER (partition by COL1 order by COL2 desc ) rankpartition by:类似hiv ...
- POJ-1180 Batch Scheduling (分组求最优值+斜率优化)
题目大意:有n个任务,已知做每件任务所需的时间,并且每件任务都对应一个系数fi.现在,要将这n个任务分成若干个连续的组,每分成一个组的代价是完成这组任务所需的总时间加上一个常数S后再乘以这个区间的系数 ...
- Hive分组取第一条记录
需求 交易系统,财务要求维护每个用户首个交易完成的订单数据(首单表,可取每个用户交易完成时间最老的订单数据).举例: 简写版的表结构: 表数据: 则 财务希望汇总记录如下: uid order_id ...
- 第3节 mapreduce高级:8、9、自定义分区实现分组求取top1
自定义GroupingComparator求取topN GroupingComparator是mapreduce当中reduce端的一个功能组件,主要的作用是决定哪些数据作为一组,调用一次reduce ...
- 工作总结 EF GroupBy() Select() Select() 中 Count() 分组 求总
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...
- pandas对时间列分组求diff遇到的问题
例子: df = pd.DataFrame() df['A'] = [1, 1, 2] df['B'] = [datetime.date(2018, 1, 2), datetime.date(2018 ...
- 第2节 网站点击流项目(下):3、流量统计分析,分组求topN
四. 模块开发----统计分析 select * from ods_weblog_detail limit 2;+--------------------------+---------------- ...
- hive分组排序 取top N
pig可以轻松获取TOP n.书上有例子 hive中比较麻烦,没有直接实现的函数,可以写udf实现.还有个比较简单的实现方法: 用row_number,生成排名序列号.然后外部分组后按这个序列号多虑, ...
随机推荐
- 设计模式之——Memento模式
Memento模式即快照模式,就是在某一时刻,设定一个状态,在后面随时可以返回到当前状态的模式. 我们拿一个闯关游戏作为举例,一共有十关,每闯一关,玩家所持金额增加一百,而闯关失败就扣一百.初始时,给 ...
- Ultra-QuickSort---poj2299 (归并排序.逆序数.树状数组.离散化)
题目链接:http://poj.org/problem?id=2299 题意就是求把数组按从小到大的顺序排列,每次只能交换相邻的两个数, 求至少交换了几次 就是求逆序数 #include<std ...
- Python开发【模块】:torndb
Torndb模块 概要:torndb是一个轻量级的基于MySQLdb封装的一个模块,其是tornado框架的一部分.其项目主页为:https://github.com/bdarnell/torndb ...
- Python开发【Django】:模板语言
排序 1.forloop.counter 表示循环的次数,它从1开始计数,第一次循环设为1 {% for item in todo_list %} <p>{{ forloop.counte ...
- DOM2和DOM3读书笔记
二刷<高程>做的笔记,没什么技术含量就不发到首页啦!~DOM1级主要定义HTML和XML文档底层结构,DOM2和DOM3在这个结构基础上引入更多交互能力,也支持更高级的XML特性.DOM2 ...
- HDU1556:Color the ball(简单的线段树区域更新)
http://acm.hdu.edu.cn/showproblem.php?pid=1556 Problem Description N个气球排成一排,从左到右依次编号为1,2,3....N.每次给定 ...
- Extjs之表单提交
Extjs的三种提交方式: 表单Ajax提交,普通提交,单独Ajax提交: 表单Ajax提交(默认提交方式) 提交函数:当按下表单中的提交按钮时执行下面的 btn函数,按照表单的 name进行提交. ...
- Java之父及Java诞生
来自为知笔记(Wiz)
- idea使用插件activate-power-mode给编码加上特效和带来乐趣。
一.安装. 1. 2. 二.使用. 1. 2.
- Codeforces Round #534 (Div. 2) Solution
A. Splitting into digits Solved. #include <bits/stdc++.h> using namespace std; int n; void sol ...