Die Anwendung Mehrerer Fenster Funktionen Auf Der Gleichen Partition
Ist es möglich, mehrere Fenster Funktionen auf der gleichen partition? (Korrigiert mich, wenn ich nicht mit dem richtigen Vokabular)
Beispielsweise können Sie tun
SELECT name, first_value() over (partition by name order by date) from table1
Aber gibt es eine Möglichkeit, etwas zu tun:
SELECT name, (first_value() as f, last_value() as l (partition by name order by date)) from table1
Wo wir sind mit zwei Funktionen in das gleiche Fenster?
Referenz:
http://postgresql.ro/docs/8.4/static/tutorial-window.html
Du musst angemeldet sein, um einen Kommentar abzugeben.
Können Sie nicht nur verwenden Sie das Fenster per Auswahl
Etwas wie
Auch von Ihrer Referenz, die Sie tun können, es so
PARTITION BY
erhöht ?PARTITION BY
undORDER BY
Klauseln wird sichergestellt, dass alle Fenster-Funktionen verwenden die gleichen einzelnen Durchlauf über die Daten. postgresql.org/docs/9.1/...Warnung : ich glaube nicht, löschen Sie diese Antwort, da es scheint, technisch richtig und daher kann hilfreich sein, aber Vorsicht, dass
PARTITION BY bar ORDER BY foo
ist wahrscheinlich nicht, was Sie tun möchten sowieso. In der Tat, Aggregat-Funktionen nicht berechnen Sie die partition, die Elemente als ein ganzes. Das istSELECT avg(foo) OVER (PARTITION BY bar ORDER BY foo)
ist nicht gleichbedeutend zuSELECT avg(foo) OVER (PARTITION BY bar)
(siehe den Nachweis am Ende der Antwort).Obwohl es nicht die Leistung verbessern per se, wenn Sie mehrere Male auf die gleiche partition, die Sie wahrscheinlich wollen verwenden Sie die zweite syntax vorgeschlagen astander, und nicht nur, weil es billiger ist, zu schreiben. Hier ist warum.
Betrachten Sie die folgende Abfrage :
Da im Prinzip der Sortierung hat keine Auswirkung auf die Berechnung des Durchschnitts, Sie könnten versucht sein, verwenden Sie stattdessen die folgende Abfrage (keine Bestellung auf der zweiten partition) :
Dies ist ein großer Fehler, wie es länger dauern wird. Beweis :
Nun, wenn Sie sich dieses Themas bewusst sind, natürlich werden Sie die gleiche partition überall. Aber wenn man das Zehnfache oder mehr der gleichen partition und aktualisieren Sie es über Tage, es ist ziemlich einfach zu vergessen, fügen Sie die
ORDER BY
- Klausel auf eine partition, die braucht nicht von selbst.Hier kommt die
WINDOW
syntax, die verhindern, dass Sie solche fahrlässigen Fehler (vorausgesetzt natürlich, Sie wissen es besser, zu minimieren die Anzahl der verschiedenen Fenster-Funktionen). Das folgende ist strikt identisch (so weit ich erzählen kann, vonEXPLAIN ANALYZE
) an der ersten Abfrage :Post-Warnung-update :
Verstehe ich die Aussage, dass "
SELECT avg(foo) OVER (PARTITION BY bar ORDER BY foo)
ist nicht gleichbedeutend zuSELECT avg(foo) OVER (PARTITION BY bar)
" fraglich erscheint, so ist hier ein Beispiel :SELECT avg(foo) OVER (PARTITION BY bar ORDER BY foo)
ist NICHT entsprichtSELECT avg(foo) OVER (PARTITION BY bar)
wie weit wir diskutieren ResultSet. Beweisen Sie bitte, dass Sie sich unterscheiden. Der Zeitpunkt der Ausführung kann natürlich variieren (wie bauen Sie zwei Unbenannte windows anstelle von einem), aber die Ergebnisse sind immer noch die gleichen.WINDOW
Befehl meiner Antwort auf dieses minimal-Beispiel :create table foobar(foo float, bar int); insert into foobar values (1,1); insert into foobar values (3,1);
mit und ohneORDER BY
.array_agg()
Ausgabe geben einen Hinweis.PARTITION
Dank! (Für Interessierte: mitORDER BY
es gibt Zeilen {1; 2}, und ohne es gibt {2; 2}.ORDER BY
sortiert die Zeilen in das Fenster, und Verfahren Sie in dieser Reihenfolge, einschließlich nur die aktuelle und die zuvor Zeilen, ignorieren von Zeilen, die nach aktuellen oder nicht in das Fenster.