2016-12-27 38 views
0

我無法做到這一點,因此我需要建模查詢的幫助。Hive查詢:根據不同列的中位數在分區上選擇列

我的數據是:

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

證實了這一點,做得很好,我一直在努力解決這個問題。天。 –

相關問題