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

이 작업이 정상적으로 완료되었습니다.이 전체 작업에 어려움을 겪고있었습니다. 일. –