首页 > 解决方案 > Hive Query:如何使用 group by 和 rank?

问题描述

我有一张如下表

year                            int                                                                                                                   
month                           int                                                                                                                   
symbol                          string                                                                                                                
company_name                    string                                                                                                                
sector                          string                                                                                                                
sub_industry                    string                                                                                                                
state                           string                                                                                                                
avg_open                        double                                                                                                                
avg_close                       double                                                                                                                
avg_low                         double                                                                                                                
avg_high                        double                                                                                                                
avg_volume                      double         

以 开头的字段avg_是指一年中一个月的平均值。我需要为每个部门找到平均值avg_close最低的年份。

我试图做类似下面的事情

SELECT sector, year FROM
  (
    SELECT sector, year, RANK() OVER (ORDER BY s2.yearly_avg_close) AS RANK FROM
      ( SELECT year,sector, AVG(avg_close) AS yearly_avg_close FROM stock_summary GROUP BY sector, year) s2
  ) s1 
WHERE
  s1.RANK = 1;

但这只是打印一个部门和一年,如下所示

Telecommunications Services     2010

我是蜂巢的新手,并且玩弄了一些玩具模式。有人可以让我知道解决这个问题的正确方法是什么吗?

蜂巢版本 - 1.1.0

标签: hadoophivehiveqlhive-query

解决方案


包含sector在函数partition by中:rank()

SELECT sector, year, RANK() OVER (partition by sector ORDER BY s2.yearly_avg_close) AS RANK

year如果您需要每个排名,也sector可以添加year

另请阅读此解释排名如何工作:https ://stackoverflow.com/a/55909947/2700344


推荐阅读