2017-09-08 17 views
0

私の目標は、さまざまなレベルのさまざまな組織の規模を決定することです。我々は3つの団体「A」、「B」、および「C」、それぞれが複数の部署からなるとメンバーとのチームでさらに細分化を有していてと仮定しましょう、下記のとおり:今HiveQL - 既存のテーブルに複数レベル小計を結合する

Org. Dep. Tm. Member 
A  1  I name1 
A  1  I name2 
A  1  I name3 
A  1  II name4 
A  2  I name5 
A  2  I name6 
B  1  I name7 
B  1  II name8 
B  1  II name9 
B  1  II name10 
B  2  I name11 
B  2  I name12 
B  2  II name13 
B  2  II name14 
B  2  III name15 
B  2  III name16 
C  1  I name17 
C  1  I name18 
C  1  I name19 
C  1  I name20 
C  1  I name21 

、私は」それぞれのメンバーについて、それぞれのOrg。、Dep。およびTm。

Org. Dep. Tm. Member org dep tm 
A  1  I name1 6 4 3 
A  1  I name2 6 4 3 
A  1  I name3 6 4 3 
A  1  II name4 6 4 1 
A  2  I name5 6 2 2 
A  2  I name6 6 2 2 
B  1  I name7 10 4 1 
B  1  II name8 10 4 3 
B  1  II name9 10 4 3 
B  1  II name10 10 4 3 
B  2  I name11 10 6 2 
B  2  I name12 10 6 2 
B  2  II name13 10 6 2 
B  2  II name14 10 6 2 
B  2  III name15 10 6 2 
B  2  III name16 10 6 2 
C  1  I name17 5 5 5 
C  1  I name18 5 5 5 
C  1  I name19 5 5 5 
C  1  I name20 5 5 5 
C  1  I name21 5 5 5 

私のオリジナルのアイデアは、複数のLEFTと、これは異なるレベルを集約するJOINS行うことでしたが、あなたは新しいが、すべての集約レベルのために参加する必要があるとして、これは非常に悪いスケール:このように、あります。これを1つのステートメントで効率的に行う方法はありますか?

答えて

2

使用ウィンドウ機能:

select org, dep, tm, 
     count(*) over (partition by org) as org_cnt, 
     count(*) over (partition by org, dep) as dep_cnt, 
     count(*) over (partition by org, dep, tm) as tm_cnt 
from t; 

列はとてもdeptm階層のより高いレベルを必要とする階層構造になっています。

EDIT:

ハイブがcount(distinct)をサポートしていないと、あなたがそれを必要とする場合は、あなたが行うことができます:

select org, dep, tm, 
     sum(case when seqnum_o = 1 then 1 else 0 end) over (partition by org) as org_cnt, 
     sum(case when seqnum_od = 1 then 1 else 0 end) over (partition by org, dep) as dep_cnt, 
     sum(case when seqnum_odt = 1 then 1 else 0 end) over (partition by org, dep, tm) as tm_cnt 
from (select t.*, 
      row_number() over partition by org, memberid order by org) as seqnum_o, 
      row_number() over partition by org, dep, memberid order by org) as seqnum_od, 
      row_number() over partition by org, dep, tm, memberid order by org) as seqnum_odt 
     from t 
    ) t; 
+0

すべてのエントリが一意であるとき、この作品への道もありますならば、あなたは知っています'count(distinct members)'をしますか?私は、distinctがグループ文でのみ動作するので、エラーが発生しています... –