Ich muss die Differenz einer Spalte zwischen zwei Zeilen einer Tabelle berechnen. Gibt es eine Möglichkeit, dies direkt in SQL zu tun? Ich verwende Microsoft SQL Server 2008.
Ich suche so etwas:
SELECT value - (previous.value) FROM table
Stellen Sie sich vor, die "vorherige" Variable verweist auf die zuletzt ausgewählte Zeile. Natürlich werde ich mit einer solchen Auswahl am Ende n-1 Zeilen haben, die in einer Tabelle mit n Zeilen ausgewählt sind. Das ist wahrscheinlich nicht genau das, was ich brauche.
Ist das irgendwie möglich?
sql
sql-server
sql-server-2008
Edwin Jarvis
quelle
quelle
Antworten:
In SQL ist kein Ordnungsbegriff integriert. Sie müssen daher nach einer Spalte sortieren, damit dies sinnvoll ist. Etwas wie das:
Wenn Sie wissen, wie man Dinge ordnet, aber nicht, wie man den vorherigen Wert unter Berücksichtigung des aktuellen Werts erhält (z. B. möchten Sie alphabetisch ordnen), dann kenne ich keine Möglichkeit, dies in Standard-SQL zu tun, aber die meisten SQL-Implementierungen haben Erweiterungen, um es zu tun.
Hier ist eine Möglichkeit für SQL Server, die funktioniert, wenn Sie Zeilen so anordnen können, dass sie jeweils unterschiedlich sind:
Wenn Sie Verbindungen trennen müssen, können Sie dem ORDER BY so viele Spalten wie nötig hinzufügen.
quelle
Verwenden Sie die Verzögerungsfunktion :
Für IDs verwendete Sequenzen können Werte überspringen, sodass Id-1 nicht immer funktioniert.
quelle
LAG(ExpressionToSelect, NumberOfRowsToLag, DefaultValue)
. Die Standardanzahl der zu verzögerenden Zeilen ist 1, aber Sie können dies und den Standardwert angeben, der ausgewählt werden soll, wenn eine Verzögerung nicht möglich ist, da Sie sich am Anfang des Satzes befinden.Oracle, PostgreSQL, SQL Server und viele mehr RDBMS - Motoren haben analytische Funktionen aufgerufen
LAG
undLEAD
das tun , um diese sehr Sache.In SQL Server vor 2012 müssen Sie Folgendes tun:
, wo
COL1
ist die Spalte, nach der Sie bestellen.Wenn Sie einen Index haben,
(COL1, PK)
wird diese Abfrage erheblich verbessert.quelle
quelle
LINKS VERBINDEN Sie die Tabelle für sich selbst, wobei die Verknüpfungsbedingung so ausgearbeitet ist, dass die in der verknüpften Version der Tabelle übereinstimmende Zeile für Ihre spezielle Definition von "Vorherige" eine Zeile früher ist.
Update: Zuerst dachte ich, Sie möchten alle Zeilen mit NULL-Werten für die Bedingung beibehalten, in der es keine vorherige Zeile gab. Wenn Sie es noch einmal lesen, möchten Sie nur, dass die Zeilen ausgesondert werden. Daher sollten Sie eine innere Verknüpfung anstelle einer linken Verknüpfung verwenden.
Aktualisieren:
Neuere Versionen von SQL Server verfügen auch über die Funktionen LAG und LEAD Windowing, die auch hierfür verwendet werden können.
quelle
quelle
Die ausgewählte Antwort funktioniert nur, wenn die Sequenz keine Lücken aufweist. Wenn Sie jedoch eine automatisch generierte ID verwenden, kann es aufgrund von zurückgesetzten Einfügungen zu Lücken in der Sequenz kommen.
Diese Methode sollte funktionieren, wenn Sie Lücken haben
quelle