Hive Query:如何使用 group by 和 rank?

Posted

技术标签:

【中文标题】Hive Query:如何使用 group by 和 rank?【英文标题】:Hive Query: How to use group by with rank? 【发布时间】:2020-03-13 04:36:23 【问题描述】:

我有一张像下面这样的表格

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

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

Hive 版本 - 1.1.0

【问题讨论】:

【参考方案1】:

sector 包含在partition byrank() 函数中:

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

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

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

【讨论】:

以上是关于Hive Query:如何使用 group by 和 rank?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 group by(基于一列)从表中选择多列,在 hive 查询中具有和计数

hive3之执行计划(Explain)Fetch 抓取本地模式表的优化Group By笛卡尔积行列过滤

hive3之执行计划(Explain)Fetch 抓取本地模式表的优化Group By笛卡尔积行列过滤

如何在 Google Big Query 中正确使用 GROUP BY 命令?

Hive之GROUP BY详解

ContentResolver 的 query() 方法中的 group by 子句出错