分组求排名

  • 相信好多使用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. MySQL Bugs: #34354: Feature request: EXPLAIN ALTER TABLE https://bugs.mysql.com/bug.php?id=34354

    MySQL Bugs: #34354: Feature request: EXPLAIN ALTER TABLE https://bugs.mysql.com/bug.php?id=34354 [SQ ...

  2. Typed Arrays in javascripts

    Typed Arrays(类型数组)这个概念,可能对很多人来说非常陌生,那么它是什么,又有什么用途呢? 之前的问题 Web应用程序变得越来越强大,例如新增了音视频处理.WebSocket等多个功能特性 ...

  3. SQL基础--查询之五--查询语句一般格式

    SQL基础--查询之五--查询语句一般格式

  4. 转载 io多路复用

    作者:ZingpLiu 出处:http://www.cnblogs.com/zingp/ 本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接. 回到 ...

  5. 每日算法之三十五:Wildcard Matching

    模式匹配的实现,'?'代表单一字符,'*'代表随意多的字符.写代码实现两个字符串是否匹配. Implement wildcard pattern matching with support for ' ...

  6. 使用spring boot ,和前端thymeleaf模板进行开发路径问题

    加入引用:<html xmlns:th="http://www.thymeleaf.org">1:引用templates模板下面的文件时,不要用/绝对路径. 2:引用s ...

  7. gstreamer应用笔记

    gstreamer官网 https://gstreamer.freedesktop.org/ 应用手册 https://gstreamer.freedesktop.org/documentation/ ...

  8. PHP生成唯一RequestID类

    https://blog.csdn.net/fdipzone/article/details/79939431 本文介绍PHP生成唯一RequestID类,使用session_create_id()与 ...

  9. PHP指定概率算法

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

  10. zoj3820 树的直径+二分

    这题是个遗憾 !!!!!当时一直不敢相信两个站一定在直径上,赛后想想自己真的是脑袋抽风, 如果其中一个站不在直径上就反向的说明了这条不是直径.可以很明白我们可以肯定的是有一个点一定在直径上假如另外一个 ...