分组求排名

  • 相信好多使用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】分组求排名的更多相关文章

  1. Hive - - 分组求最大,最小(加行键)

    Hive - - 分组求最大,最小(加行键) 数据: 1325927 陕西 汉中 084 08491325928 陕西 汉中 084 08491325930 陕西 延安 084 08421325931 ...

  2. hive 分组排序,topN

    hive 分组排序,topN 语法格式:row_number() OVER (partition by COL1 order by COL2 desc ) rankpartition by:类似hiv ...

  3. POJ-1180 Batch Scheduling (分组求最优值+斜率优化)

    题目大意:有n个任务,已知做每件任务所需的时间,并且每件任务都对应一个系数fi.现在,要将这n个任务分成若干个连续的组,每分成一个组的代价是完成这组任务所需的总时间加上一个常数S后再乘以这个区间的系数 ...

  4. Hive分组取第一条记录

    需求 交易系统,财务要求维护每个用户首个交易完成的订单数据(首单表,可取每个用户交易完成时间最老的订单数据).举例: 简写版的表结构: 表数据: 则 财务希望汇总记录如下: uid order_id ...

  5. 第3节 mapreduce高级:8、9、自定义分区实现分组求取top1

    自定义GroupingComparator求取topN GroupingComparator是mapreduce当中reduce端的一个功能组件,主要的作用是决定哪些数据作为一组,调用一次reduce ...

  6. 工作总结 EF GroupBy() Select() Select() 中 Count() 分组 求总

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...

  7. pandas对时间列分组求diff遇到的问题

    例子: df = pd.DataFrame() df['A'] = [1, 1, 2] df['B'] = [datetime.date(2018, 1, 2), datetime.date(2018 ...

  8. 第2节 网站点击流项目(下):3、流量统计分析,分组求topN

    四. 模块开发----统计分析 select * from ods_weblog_detail limit 2;+--------------------------+---------------- ...

  9. hive分组排序 取top N

    pig可以轻松获取TOP n.书上有例子 hive中比较麻烦,没有直接实现的函数,可以写udf实现.还有个比较简单的实现方法: 用row_number,生成排名序列号.然后外部分组后按这个序列号多虑, ...

随机推荐

  1. jQuery change事件

    定义和用法 当元素的值发生改变时,会发生 change 事件. 该事件仅适用于文本域(text field),以及 textarea 和 select 元素. change() 函数触发 change ...

  2. Python开发【Django】:Model操作(二)

    Model操作 1.操作汇总: # 增 # # models.Tb1.objects.create(c1='xx', c2='oo') 增加一条数据,可以接受字典类型数据 **kwargs # obj ...

  3. PHP指定概率算法

    转载来源链接: https://blog.csdn.net/sinat_35861727/article/details/54980807 PHP指定概率算法,可用于刮刮卡,大转盘等抽奖算法. 假设: ...

  4. Linux下编译安装PHP扩展memcached

    [安装 libevent] $ tar zxvf libevent-2.0.20-stable.tar.gz $ cd libevent-2.0.20-stable/$ ./configure --p ...

  5. uva11404

    这题说的是给了一个长度为n的字符串(1000)求最长回文子序列,并输出当str[i]==ste[j]时dp[i][j]=dp[i+1][i-1]+2 否则 dp[i][j]=Max(dp[j+1][i ...

  6. CSS实现超出DIV宽度文字自动隐藏并显示省略号

    当文字超出DIV宽度时,超出的文字部分省略,并用显示省略号代替,css代码如下: div.ellipsis { padding-left: 5px; text-align: left; text-ov ...

  7. docker 删除所有的 docker ps -a 记录

    docker rm `docker ps -a -q` 删除的是镜像运行的实例,要删除镜像用docker rmi + 镜像名或者那串字符(image  id)

  8. SharedObject对象聊天室

    本博推荐文章快速导航: Sql Server2005 Transact-SQL 新兵器学习MCAD学习 代码阅读总结 ASP.NET状态管理 DB(数据库)WAPWinFormFlex,Fms aie ...

  9. 项目管理工具- Maven

    <settings xmlns="http://maven.apache.org/SETTINGS/1.0.0" xmlns:xsi="http://www.w3. ...

  10. Oozie的详细启动步骤(CDH版本的3节点集群)

    不多说,直接上干货! 我的机器情况是,bigdatamaster(Oozie是安装在这台节点上).bigdataslave1和bigdatalsave2. 启动步骤 第一:先启动mysqld服务进程 ...