Montag, März 11, 2013

Analytics mit row-Angabe in der window clause

Kim Berg Hansen, der Steven Feuerstein regelmäßig bei der PL/SQL Challenge unterstützt, erläutert das unterschiedliche Verhalten von row- und range-Angaben (letztere sind der default) in der window clause von Analytics, wobei sein Beispiel eine analytische Summenfunktion zur Ermittlung einer rolling sum ist (also einer Summe bis zum gegebenen Satz): mit dem default (range) erscheint für gleiche Werte in der ORDER BY-Sortierspalte auch die gleiche aggregierte Summe, was nicht unbedingt intuitiv ist. Möchte man eine rolling sum haben, die für jeden Satz die bis dorthin aggregierten Summen ausweist, so muss man eine window clause mit row-Angabe verwenden - also z.B.:

sum(sal) over (partition by deptno
                   order by sal
                    rows between unbounded preceding and current row)

Neben dem plausibleren Ergebnis hat die Verwendung der row-Angabe auch den Vorteil, dass sie im Fall der Verschachtelung mehrerer analytischer Funktionen einen WINDOW NOSORT-Schritt an einer Stelle möglich macht, an der sonst eine zusätzliche Sortierung erfolgen müsste. Daher liefert der Herr Hansen folgende Merksätze:
  • If I am doing analytic on the entire partition (or entire resultset), then I skip the window clause (that is: I do not write ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING).
  • But once I have an ORDER BY, I generally do not rely on default window clause, but rather explicitly writes either ROWS or RANGE BETWEEN.
Meine Zusammenfassung ist in diesem Fall übrigens (wieder einmal) deutlich unverständlicher als die Quelle, die den Fall anhand kompakter Beispiele nachvollziehbar erläutert.

Keine Kommentare:

Kommentar veröffentlichen