PostgreSQL ermöglicht die Verwendung von Windowing Functions innerhalb eines Subselects. Es ist daher möglich, Windowing Functions zu schachteln:
test=# SELECT tstamp, revenue, growth || ' %' AS growth, rank() OVER (ORDER BY growth DESC NULLS LAST) FROM ( SELECT tstamp, revenue, round((revenue::numeric - delay) / revenue * 100, 2) AS growth FROM (SELECT tstamp, revenue, lag(revenue, 1) OVER (ORDER BY tstamp) AS delay FROM t_business WHERE country = 'DE' ) AS x ) AS y ORDER BY tstamp; tstamp | revenue | growth | rank ------------+---------+----------+------ 2009-10-01 | 20 | | 4 2009-10-02 | 18 | -11.11 % | 3 2009-10-03 | 23 | 21.74 % | 1 2009-10-04 | 26 | 11.54 % | 2 (4 rows)
Im inneren SELECT verwenden wir eine Windowing Function, um die Verschiebung innerhalb des Frames durchzuführen. Im äußeren SELECT ranken wir die Ergebnisse und formatieren die Differenzen. Besonders zu beachten ist, dass man in einer OVER-Clause angeben kann, ob NULL Werte im Window Frame vorne oder hinten stehen. Das ist in unserem Beispiel interessant, um den NULL Wert im growth Feld auf den letzten Rang zu schicken.