2016-12-27 3 views
0

私はそれができないので、クエリのモデリングに助けが必要です。ハイブクエリ:別の列の中央値に基づいてパーティション上の列を選択する

私のデータは次のとおりです。

id name school height 
1 A  S1  10 
2 B  S1  12 
3 C  S1  14 
4 D  S2  15 
5 E  S2  16 
6 F  S2  17 

私は学校ごとの中央値の高さで名と名前を選択します。

予想される出力:ここ

id name school myval 
1 A S1 B 
2 B S1 B 
3 C S1 B 
4 D S2 E 
5 E S2 E 
6 F S2 E 

、人物Bは、学校S1における中央値の高さを持っており、EはS2であります。

私は、パーセンタイルを使用して中央値を得ることができます。しかし、私はパーティションごとの値を選択する方法を理解することができません。

+0

を使用すると、グループ内の観測値の偶数を持っている場合、中央値は、対応する値と等しくないでしょう学校。あなたはその場合何をすべきですか? –

+0

はい、これはエッジケースです。 :( 実際には私の場合は中間値が良いですが、中間の値でもN/2またはN/2 + 1になることがありますが、それは違いはありません。 ROWNUM? – Adi

答えて

0

これは、中央列のクエリ以下

select a.id,a.name,a.school,a.height, b.median from your_table a join (select school, CAST(percentile(CAST(height as BIGINT),0.5) as INT) as median from your_table group by school) b on a.school = b.school; 
+0

これは正解ではありません。高さの中央値を選択していますが、myval欄に高さの中央値を持つ名前を入れたいと考えています – Adi

1

が動作します提供します: -

select 
    temp1.id, 
    temp1.name, 
    temp1.school, 
    temp2.name 
from 
    (select 
    id, 
    name, 
    school, 
    height 
    from 
    TABLE_NAME 
) temp1 
    left Join   
    (select 
     school, 
     name 
    from 
     (select 
     id, 
     name, 
     school, 
     height, 
     SUM(height) OVER 
      (PARTITION BY school)/COUNT(height) OVER 
       (PARTITION BY school) as avg 
     from 
     TABLE_NAME) AVERG 
    where height=avg) temp2 on temp1.school=temp2.school ; 
+0

この作業を確認しました。日。 –

関連する問題