2017-02-21 2 views
0

У меня есть эта таблица, каждая строка жертвуя продажу:Получить Top N строк в день в улье - ранг()

sale_date salesman sale_item_id 
20170102 JohnSmith  309 
20170102 JohnSmith  292 
20170103 AlexHam   93 

Я пытаюсь получить 20 лучших продавцов в день, и я придумал это:

SELECT sale_date, salesman, sale_count, row_num 
FROM (
    SELECT sale_date, salesman, 
     count(*) as sale_count, 
     rank() over (partition by sale_date order by sale_count desc) as row_num 
    from salesforce.sales_data 
) T 
WHERE sale_date between '20170101' and '20170110' 
and row_num <= 20 

Но я получаю:

FAILED: SemanticException Failed to breakup Windowing invocations into Groups. At least 1 group must only depend on input columns. Also check for circular dependencies. 
Underlying error: org.apache.hadoop.hive.ql.parse.SemanticException: Line 5:35 Expression not in GROUP BY key 'sale_date' 

Я не уверен, в какой момент группировка вступит в силу, хотя. Может кто-нибудь помочь? Tx!

ответ

2

Вы отсутствуете в подзапросе в group by:

SELECT sale_date, salesman, sale_count, row_num 
FROM (SELECT sale_date, salesman, 
      count(*) as sale_count, 
      rank() over (partition by sale_date order by count(*) desc) as row_num 
     FROM salesforce.sales_data 
     GROUP BY sale_date, salesman 
    ) T 
WHERE sale_date between '20170101' and '20170110' and row_num <= 20; 

Я думаю, что улей принимает псевдоним столбца в order by, order by sale_count desc.

Также обратите внимание, что вы можете получить более или менее 20 строк, если есть связи. Вам может понадобиться row_number(), если вам нужно ровно 20 строк.

+0

Спасибо @Gordon - Я получаю ту же ошибку, но с выражением не в GROUP BY key "sale_count '". Алиасы AFAIK не могут использоваться в групповых предложениях, но для этого я добавил его в предложение группы и получил «Недопустимый псевдоним таблицы или ссылку на колонку« sale_count »« – Craig

+0

вам не нужна группа использования с помощью оконных функций. – hlagos

+0

@lake , , , Вы делаете, если рейтинг находится на агрегации. –

0

попробовать этот

SELECT sale_date, salesman, sale_count, row_num from (
SELECT sale_date, salesman, sale_count, 
rank() over (partition by sale_date order by sale_count desc) as   row_num 
from 
(
SELECT sale_date, salesman, 
    count(*) over (partition by salesman) as sale_count 
from employee 
) t1 
) t2 where sale_date between '20170101' and '20170110' 
and row_num <= 20; 
WHERE sale_date between '20170101' and '20170110' 
and row_num <= 20 

отредактированный и testest. Ваша проблема состоит в том, что вы пытаетесь использовать счетчик, прежде чем вычислять его для вашего предложения over, если вы вычислите свой счет в подзапросе, который будет продаваться продавцом, он решит проблему. Вы не можете сделать группу в запросе на продажу, если вы это сделаете, у вас не будет доступа к sale_date.

Смежные вопросы