2016-10-06 1 views
0

Ich habe eine Tabelle enthält Abteilung, Gruppe, Klasse, SUB_CLASS, wie die höchsten 3 zählt in jedem SUB_CLASSSQL, wie die ersten drei Werte in jeder Kategorie holen

select division ,group,class,sub_class, count(*) as number_cnt, 

       ROW_NUMBER() over (partition by division ,group,class 
       order by number_cnt) as RowNum 
    from mydata 
    order by division,group,class, number_cnt desc 

dann holen will ich holen die RowNum < = 3 Aber es zurückgeben kann Nummer_cnt nicht auflösen, aber ich brauche diese Nummer_cnt in der Reihenfolge von.

mydata nachdem ich zähle die Anzahl der einzelnen SUB_CLASS wie dies

 division group class   subclass  number_cnt 
    plant  fruit tropical fruit banana   10 
             jackfruit  5 
             passion fruit 3 
             coconut   2 

sein wird ich die ersten drei Zählungen für jede Division gruppen Klasse-Subklassenkombination

 division group class   subclass  number_cnt 
    plant  fruit tropical fruit banana   10 
             jackfruit  5 
             passion fruit 3 

herauszuzupicken hoffen Irgendeine Hilfe? Danke.

+0

Was ist die Kategorie hier? – Teja

+0

Beispieldaten und gewünschte Ergebnisse würden wirklich helfen. –

+0

es zurückgibt kann number_cnt Fehler nicht auflösen, aber ich denke, Reihenfolge von number_cnt ist hinter auswählen. – newleaf

Antwort

0
SELECT division, 
     group, 
     class, 
     sub_class, 
     ROW_NUMBER() over (partition by trade_division ,group,class 
         order by number_cnt) as RowNum 

    FROM 
    (  select division , 
        group, 
        class, 
        sub_class, 
        count(*) OVER (PARTITION BY trade_division,group,class) AS number_cnt    
      from my data 
    ) 

WHERE RowNum <=3 
order by division,group,class, number_cnt desc; 
0

Hmmm. Unter der Annahme, dass Sie die 10 höchsten Unterklassen für jede Abteilung/Gruppe/Klasse wollen:

select t.* 
from (select division, group, class, sub_class, count(*) as number_cnt, 
       row_number() over (partition by division, group, class 
            order by count(*) desc 
           ) as seqnum 
     from my data 
     group by division, group, class, sub_class 
    ) t 
where seqnum <= 10; 

Sie wollen Windows-Funktionen mit Aggregation verwenden. Beachten Sie, dass sub_class in der group by, aber nicht in der partition by für row_number() ist.

Hinweis: Ihre Spaltennamen sind inkonsistent. Und Sie sollten nicht SQL-Schlüsselwörter (wie group) als Spaltennamen verwenden.

0

Bitte versuchen Sie, wenn dies hilft.

SELECT * from( 
    select division ,group,class,sub_class, count(*) as number_cnt, 
    ROW_NUMBER() over (partition by trade_division ,group,class 
    order by number_cnt) as RowNum 
    from my data) a 
    WHERE RowNum<=3 
+0

Erklären Sie Ihren Code und geben mehr Details wäre wahrscheinlich hilfreich. –

Verwandte Themen