Hive Query: Как использовать group by с рангом? - PullRequest
1 голос
/ 13 марта 2020

У меня есть таблица, как показано ниже

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 - 1.1.0

1 Ответ

0 голосов
/ 13 марта 2020

Включите sector в partition by в функции rank():

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

Добавьте year, а также если вам нужен ранг для каждого sector и year

Прочтите также это объяснение того, как работает ранг: { ссылка }

...