2016-12-27 5 views
0

Ich brauche Hilfe bei der Modellierung einer Abfrage, da ich dazu nicht in der Lage bin.Hive-Abfrage: Auswählen der Spalte über eine Partition basierend auf einem Median einer anderen Spalte

Meine Daten:

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 

ich den Namen und den Namen mit einer medianen Höhe pro Schule auswählen möchten.

Erwartete Ausgabe:

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 

Hier Person B hat die mittlere Höhe in der Schule S1 und E hat in S2.

Ich weiß, wir können Median mit Perzentil erhalten. Aber ich bin nicht in der Lage, herauszufinden, wie man den Wert pro Partitionsbasis auswählt.

+0

, wenn Sie gerade Anzahl von Beobachtungen in einer Gruppe haben, wäre der Median nicht gleich ein Wert mit einem entsprechenden Schule. Was sollten Sie in diesem Fall tun? –

+0

Ja, das ist ein Randfall. :( Eigentlich in meinem Anwendungsfall bin ich gut mit dem mittleren Wert. Für gerade Elemente kann der mittlere Wert N/2 oder N/2 + 1 sein. Das wird keinen Unterschied machen. Ich denke, ich sollte einige Operation verwenden ROWNUM? – Adi

Antwort

0

Dies gibt die mittlere Spalte

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

Dies wird nicht die richtige Antwort geben. Sie wählen den Median der Höhe. Stattdessen möchte ich den Namen, der den Median der Höhe in der Myval-Spalte hat. – Adi

1

unter Abfrage funktioniert: -

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

Bestätigt, das funktioniert. Gut gemacht. Ich kämpfte mit diesem Ganzen Tag. –

Verwandte Themen