2017-02-21 6 views
0

を私は各行が販売を寄付、このテーブルを持っている:ハイブに一日あたりの上位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 byorder by sale_count descを列の別名を受け入れると思います。

また、関連がある場合は、20行以上または20行未満を取得できます。正確に20行が必要な場合は、row_number()が必要になる場合があります。

+0

ありがとう@Gordon - 私は今、同じエラーが表示されますが、 "GROUP BYキーではない式が" sales_count '"になっています。 AFAIKエイリアスはグループ句では使用できませんが、グループ句に追加して「無効なテーブルエイリアスまたはカラム参照 'sales_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節に対してそれを計算する前にカウントを使用しようとしていることです。セールスマンがサブクエリを分割してカウントを計算すると問題は解決します。販売クエリでグループを行うことはできません。そうした場合、sales_dateにアクセスすることはできません。

関連する問題