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
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich denke, was Sie eigentlich suchen, ist dies:
Erzeugt das angeforderte Ergebnis.
Fenster-Funktionen angewendet werden nach Aggregatfunktionen. Die äußeren
sum()
imsum(sum(v))
ist eine Fenster-Funktion in diesem Beispiel und ist an denOVER ...
- Klausel, während die inneresum()
ist ein Aggregat.Effektiv das gleiche wie:
Oder (ohne CTE):
Oder @Mu-Variante.
Beiseite: Greenplum eingeführt, korrelierte Unterabfragen, die mit der version 4.2. Siehe release notes.
Mein Leben gerettet! bedanken Sie sich bei u
InformationsquelleAutor Erwin Brandstetter
Müssen Sie tun es alle mit Fenster-Funktionen? Klingt wie Sie brauchen nur, um der Gruppe das Ergebnis, das Sie haben, indem Sie
d1
undd2
und dann die Summe der Summen:Dass mir dies:
InformationsquelleAutor mu is too short