Hallo, ich wollte eine Abfrage machen in der er mir alle Zeilen ausgibt die einen höheren Wert haben als ihre Vorgängerzeilen.
Als Beispiel:
Zeile1: 1
Zeile2: 7
Zeile3: 3
Zeile4: 4
Zeile5: 8
So soll er mir folgendes ausgeben:
Zeile1: 1
Zeile2: 7
Zeile3: 8
Ich dachte mir ich schreibe eine Funktion die einen Wert gegen den maximalen Wert testet also:
SELECT X FROM A
WHERE FUNCTION(X) = TRUE;
und die Funktion dazu wuerde dann so aussehen:
FUNCTION ( PARAM ) RETURN RESULT
(
IF X >= MAX
(
MAX = X
RESULT= TRUE
)
ELSE
RESULT FALSE
)
aber der maximale Wert ist beim nächsten Funktionsaufruf ja wieder weg… … oder kann ich einen Wert irgendwie global speichern ?
Datenbanken arbeiten mit Mengen. Da gibt es erst einmal so keinen Vorgänger/Nachfolger. Außerdem ist Dein Beispiel falsch, es müßten ja dann Zeilen 2,4 und 5 sein, oder?
Egal, ich glaube zu verstehen, was Du willst:
test=*# select * from menge;
id | zahl
----+------
1 | 1
2 | 7
3 | 3
4 | 4
5 | 8
(5 Zeilen)
Zeit: 0,280 ms
test=*# select m2.* from menge m1, menge m2 where m2.id=m1.id+1 and m2.zahl > m1.zahl;
id | zahl
----+------
2 | 7
4 | 4
5 | 8
(3 Zeilen)
oder
test=# select m2.* from menge m1, menge m2 where m2.id=m1.id+1 and m2.zahl > (select max(zahl) from menge where id<m2.id);
id | zahl
----+------
2 | 7
5 | 8
(2 Zeilen)
Wenn Du dazu noch die erste Zeile haben willst, böte sich ein UNION an.
Ich vertraue hier darauf, daß die ID-Spalte streng monoton um 1 ansteigt.
Hilft das weiter?
Ansonsten, warte auf 8.4, das wird (hoffentlich) windowing-Funktionen haben.