Wie Sie eine SQL-Fenster-Funktion, um einen Prozentwert zu berechnen, der ein Aggregat

Muss ich berechnen Prozentsätze der verschiedenen Dimensionen in einer Tabelle. Ich möchte die Dinge zu vereinfachen, durch die Verwendung von Fenster-Funktionen zur Berechnung der Nenner, jedoch habe ich ein Problem, weil der Zähler hat ein Aggregat als gut.

Als einfaches Beispiel nehmen wir die folgende Tabelle:

create temp table test (d1 text, d2 text, v numeric);
insert into test values ('a','x',5), ('a','y',5), ('a','y',10), ('b','x',20);

Wenn ich nur wollen, berechnen Sie den Anteil jeder einzelnen Zeile aus der d1, dann windowing-Funktionen funktionieren:

select d1, d2, v/sum(v) over (partition by d1)
from test;

"b";"x";1.00
"a";"x";0.25
"a";"y";0.25
"a";"y";0.50

Jedoch, was ich tun müssen, ist, berechnen Sie den Anteil für die Summe von d2 aus d1. Die Ausgabe die ich Suche, ist dies:

"b";"x";1.00
"a";"x";0.25
"a";"y";0.75

Also ich versuchen, diese:

select d1, d2, sum(v)/sum(v) over (partition by d1)
from test
group by d1, d2;

Aber jetzt bekomme ich eine Fehlermeldung:

ERROR:  column "test.v" must appear in the GROUP BY clause or be used in an aggregate function

Ich gehe davon aus dies ist weil es wird beklagt, dass die Fenster-Funktion ist nicht berücksichtigt in der grouping Klausel, jedoch windowing-Funktionen genommen werden können, die in der Gruppierung-Klausel sowieso.

Dies ist mit Greenplum 4.1, das ist ein fork von Postgresql 8.4 und teilt die gleiche windowing-Funktionen. Beachten Sie, dass die Greenplum nicht korrelierte Unterabfragen.

InformationsquelleAutor EvilPuppetMaster | 2011-12-15

Schreibe einen Kommentar