2016-04-15 14 views
0

Ich möchte den Unterschied zwischen der vorherigen und der aktuellen Spalte berechnen und eine neue Spalte namens increase erstellen. Dafür verwende ich die lag window function. Der Wert der ersten Spalte ist nicht definiert, da keine vorherige Spalte existiert. Ich weiß, dass ein dritter Parameter den Standardwert angibt. Es kommt jedoch darauf an. Für die erste Zeile möchte ich den Wert einer anderen Spalte verwenden, z. die von count aus dieser aktuellen Reihe. Dies setzt voraus, dass 0 erhöht wird, um für die erste Zeile zu zählen, was ich brauche. Das Angeben des Spaltennamens als drittes Argument für die lag-Funktion funktioniert nicht ordnungsgemäß und funktioniert auch nicht mit 0. Wie kann es getan werden? Ich bekomme seltsame Ergebnisse wie z. B. ein zufälliges Ergebnis oder sogar negative Zahlen.Zugriff auf den aktuellen Zeilenwert mit Verzögerungsfunktion

ERROR: window function calls cannot be nested 
+0

Bitte geben Sie einige Beispieldaten (ein Dutzend Zeilen) und was sollte das richtige Ergebnis der Abfrage für diese Beispieldaten sein. –

Antwort

0

COUNT ist ein reserviertes Wort in SQL:

SELECT *, mycount - lag(mycount, 1) OVER (ORDER BY id, messtime ASC) AS increase FROM measurements; 

Fensterfunktionen können auch nicht verschachtelt werden. Es scheint, dass das DBMS denkt, dass Sie COUNT und LAG irgendwie verschachteln möchten.

Verwenden Sie einen anderen Spaltennamen oder verwenden Sie Anführungszeichen für die Spalte:

SELECT *, "count" - lag("count", 1) OVER 
+0

Das ist nicht das Problem hier. Entschuldigung für die Verwirrung – BullyWiiPlaza

0

Es gibt ein weiteres Problem mit Ihrer Anfrage: Bisher Ihre Ergebnisse sind in zufälliger Reihenfolge, so dass Sie denken, Sie können Probleme, die don sehen‘ t existieren.

Fügen Sie Ihrer Abfrage ORDER BY id, messtime hinzu, um die Zeilen in der richtigen Reihenfolge anzuzeigen. Jetzt können Sie eine Zeile direkt mit ihrem Vorgänger vergleichen. Gibt es noch Probleme? Wenn ja, welches genau?

SELECT *, "count" - lag("count", 1) OVER (ORDER BY id, messtime) AS increase 
FROM measurements 
ORDER BY id, messtime;