Windows auf Windows aufbauen

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.




Cybertec Schönig & Schönig GmbH
PostgreSQL support, training, consulting
www.postgresql-support.de