2017-10-16 1 views
0

Gruppierung Ich habe die folgende Tabelle:die höchste Anzahl für eine kategorische Variable auswählt, wenn

custID Cat 
    1 A 
    1 B 
    1 B 
    1 B 
    1 C 
    2 A 
    2 A 
    2 C 
    3 B 
    3 C 
    4 A 
    4 C 
    4 C 
    4 C 

Was ich brauche, der effizienteste Weg ist durch CustID in einer solchen Weise, dass ich die häufigste Kategorie erhalten zu aggregieren (Katze), die zweithäufigste und die dritte. Der Ausgang des oben sollte

most freq 2nd most freq 3rd most freq 
1  B    A    C 
2  A    C    Null 
3  B    C    Null 
4  C    A    Null 

werden, wenn es einen Gleichstand in der Zählung ist mir egal, was wirklich ist zuerst und was Sekunde. Zum Beispiel könnte für Kunde 1 die zweithäufigste und die dritthäufigste Frequenz ausgetauscht werden, da jede von ihnen nur einmal auftritt.

würde jeder SQL fein, bevorzugt Hive SQL sein.

Danke

Antwort

3

Try group by zweimal zu verwenden und dense_rank() accorting zum cat Zahl zu sortieren. Eigentlich bin ich mir nicht 100% ig sicher, aber ich denke, es sollte auch im Bienenstock funktionieren.

select custId, 
    max(case when t.rn = 1 then cat end) as [most freq], 
    max(case when t.rn = 2 then cat end) as [2nd most freq], 
    max(case when t.rn = 3 then cat end) as [3th most freq] 
from 
(
    select custId, cat, dense_rank() over (partition by custId order by count(*) desc) rn 
    from your_table 
    group by custId, cat 
) t 
group by custId 

demo

Nach den Kommentaren ich etwas Lösung modifiziert hinzufügen, die mit Hive SQL

select custId, 
    max(case when t.rn = 1 then cat else null end) as most_freq, 
    max(case when t.rn = 2 then cat else null end) as 2nd_most_freq, 
    max(case when t.rn = 3 then cat else null end) as 3th_most_freq 
from 
(
    select custId, cat, dense_rank() over (partition by custId order by ct desc) rn 
    from (
    select custId, cat, count(*) ct 
    from your_table 
    group by custId, cat 
) your_table_with_counts 
) t 
group by custId 

Hive SQL demo

+2

Verwendung 'dense_rank' statt' row_number' entspricht, so dass Verbindungen don Wenn es sie gibt, erscheinen sie nicht in den zweit- und dritthäufigsten Werten. ja –

+0

@VamsiPrabhala dank –

+1

auch entfernen '[]' für Spalte-Aliase, da sie nicht in Hive unterstützt. –

Verwandte Themen