Trendberechnung

Hallo Forum,

Ich habe heute wieder einmal eine Frage zu einem für mich etwas komplizierten SQL Statement. Ich möchte über eine Zeitreihe einen Trend berechnen.
Ich habe eine Tabelle wie folgt:

indikator | raumeinheit | jahr | wert
100 | 303 | 1980 | 2242
100 | 303 | 1981 | 2271
100 | 303 | 1982 | 2280
100 | 303 | 1983 | 2278
100 | 303 | 1984 | 2298
100 | 304 | 1980 | 1899
100 | 304 | 1981 | 1987
100 | 304 | 1982 | 1989
100 | 304 | 1983 | 1995

Ich möchte jetzt jeweils für jede Raumeinheit den Trend der Daten über alle Jahre pro Raumeinheit berechnen. Also als Ergebnis eine Tabelle mit dem jeweiligen Trendwert pro Raumeinheit.
Dabei sollen ausserdem die ersten Jahre mehr Gewicht bekommen als die älteren. Hierfür wird also jedes Jahr noch gewichtet. Das neueste jahr bekommt den Faktor 1, das nächste dem Faktor 0.5, das nächste den Faktor 0.25 (also immer die Hälfte vom vorigen).
Den Trend würde ich gern so berechnen:
(((100 / [wert+1]) * [wert]) -100) * faktor

für raumeinheit 303:
(((100 / 2271) * 2242) - 100) * 1
+
(((100 / 2280) * 2271) - 100) * 0.5
+
(((100 / 2278) * 2280) - 100) * 0.25

Ich habe jetzt etwas wie folgt versucht, aber ich bekomme das nicht richtig hin.

select raumeinheit,jahr,(((100/datenwert)*lag(datenwert) over(order by raumeinheit,jahr))-100) as steigung from ind10001 group by indikator,raumeinheit,jahr

Am liebsten wäre es mir wenn ich das in einer Funktion abfragen könnte. Irgendwas wie select trend(<>) from tabelle. Hat jemand einen Tipp wie ich die Abfrage über SQL hinbekommen kann, oder vielleicht noch besser wie eine Funktion aussehen könnte? Geht das überhaupt? Ich bin für jede Hilfe und jeden Tipp dankbar.
Vielen Dank schon einmal im Voraus.

Mit freundlichen Grüssen
Hanno

Ich denke, was Du suchst geht über Window-Funktionen:

test=*# select * from hanno ;
  r  | jahr | wert
-----+------+------
 303 | 1980 | 2242
 303 | 1981 | 2271
 303 | 1982 | 2280
 303 | 1983 | 2278
 303 | 1984 | 2298
 304 | 1980 | 1899
 304 | 1981 | 1987
 304 | 1982 | 1989
 304 | 1983 | 1995
(9 rows)

Time: 0,121 ms
test=*# select *, ((100 / lead(wert) over (partition by r order by jahr)::float * wert) - 100) * row_number() over (partition by r order by jahr) from hanno;
  r  | jahr | wert |      ?column?
-----+------+------+--------------------
 303 | 1980 | 2242 |  -1.27697049757816
 303 | 1981 | 2271 | -0.789473684210549
 303 | 1982 | 2280 |  0.263388937664615
 303 | 1983 | 2278 |  -3.48128807658838
 303 | 1984 | 2298 |
 304 | 1980 | 1899 |  -4.42878711625566
 304 | 1981 | 1987 | -0.201106083459024
 304 | 1982 | 1989 | -0.902255639097746
 304 | 1983 | 1995 |
(9 rows)

Das ist nun unvollständig, klar. Insbesondere auch flasch, weil row_numver() 1,2,3,4 liefert und nicht 1, 0.5, 0.25 etc., da fällt Dir sicher noch was ein. Für die jeweils letzten Werte der Gruppe geht die Formel auch nicht, weil ja der Wert in der Zukunft unbekannt ist. Aber ich denke, das sollte Dir schon etwas helfen, oder?