2017-02-01 4 views
0

Ich versuche, die folgende Abfrage zu schreiben, um eine Anzahl von Zeilen nach Gruppe zu erhalten.Zeilenanzahl nach Gruppe

select 
    a.employee, a.cov_option, 
    count(a.cov_option) over (partition by a.cov_option order by a.employee) as row_num 
from wilson.benefit a 
inner join wilson.bncategory b 
    ON a.plan_type = b.plan_type and a.plan_option = b.plan_option 
inner join wilson.bncovopt c 
    ON a.company = c.company and a.plan_code = c.plan_code and a.cov_option = c.coverage_opt 
where 
    a.plan_type = 'HL' and 
    to_char(a.stop_date, 'yyyy-mm-dd') = '1700-01-01' 
order by a.employee, a.cov_option 

Das Ergebnis zurückgegeben wird:

employee  | cov_option |row_num 
-------------|--------------|-------------- 
429   | 1   | 1 
429   | 3   | 2 
429   | 3   | 2 
1420   | 1   | 2 
1420   | 3   | 4 
1420   | 3   | 4 
1537   | 2   | 2 
1537   | 2   | 2 

Die Ergebnismenge I ist zurück bin versucht:

429   | 1   | 1 
429   | 3   | 2 
429   | 3   | 2 
1420   | 1   | 1 
1420   | 3   | 2 
1420   | 3   | 2 
1537   | 2   | 1 
1537   | 2   | 1 
+0

Können Sie etwas genauer hinzufügen, warum Sie die beobachteten Werte für falsch halten und warum das erwartete Ergebnis Ihrer Meinung nach korrekt ist? – John

+0

@John - das OP "denkt" nicht das "erwartete Ergebnis" ist korrekt; er sagt uns, dass das "erwartete Ergebnis" das ** erforderliche ** Ergebnis ist. – mathguy

+0

Ich schätze das Feedback. Wie mathguy sagte, sind die erwarteten Ergebnisse erforderlich und sie sind korrekt. Ich versuche, die Zeilen zu zählen, ändere aber nur den Wert, wenn cov_option und Mitarbeiter sich ändern. – Daniel

Antwort

0

Was Sie scheinen zu wollen, ist dense_rank() statt count(). In der Tat bedeutet "zählen", einfach zu bestimmen, wie viele Reihen in jeder Gruppe sind, es zählt nicht in der Art, wie wir als Kinder lernen (erster, zweiter, dritter). Diese Art des Zählens wird "Ranking" genannt.

dense_rank() over (partition by a.employee order by a.cov_option) as row_num 

sollte tun, was Sie brauchen.

Es gibt auch rank() - der Unterschied ist, dass, wenn zwei Reihen für die ersten gebunden sind, mit dense_rank() die dritten Reihe bekommt Rang 2; mit einfachem rank() bekommt es Rang 3 (Rang 2 wird von den ersten zwei Zeilen "aufgebraucht").

+0

Ihre Lösung hat das Problem gelöst. Ich schätze Ihre Hilfe und Erklärung. Ich werde auch in Rang() schauen, damit ich ein volles Verständnis habe. Danke noch einmal. – Daniel