Sie müssen eine Zeilennummernspalte erstellen, wenn Ihre IDs nicht ohne Lücken erhöht werden. Dann können Sie einen einfachen Join verwenden, um den vorherigen N zu finden. Ihr vorheriges N könnte sich überlappen ... also müssen Sie distinct
hinzufügen, wenn Sie keine Duplikate wollen.
Wenn einer der vorherigen @N
Datensätze ein Fehler ist, wird der 'Fehler' Datensatz NICHT angezeigt. Dies müsste geändert werden, wenn Sie möchten, dass diese einbezogen werden. Entfernen Sie einfach die Zeile and Prev.Message <> 'Error'
.
Sie können dies mit cross apply
tun. Die Logik unterscheidet sich ein wenig von typischen Anwendungen, weil Sie nur die Datensätze aus der Unterabfrage cross apply
wollen:
Für diejenigen, die geneigt sind, gibt es auch eine Methode, die Fensterfunktionen verwendet, aber es ist etwas mühsamer. Führen Sie eine umgekehrte kumulative Summe von Error
Records aus, um Werte vor einem bestimmten Fehler zu identifizieren. Zählen Sie diese auf und wählen Sie die gewünschten aus:
Beachten Sie, dass der Filter zwischen 2 und 3 liegt, weil 'Error'
den Wert 1 hat.
Dies wäre ein bisschen einfacher, wenn Sie ein Identitätsfeld für ID verwenden würden, dann hätten Sie fortlaufende Nummern, aber Sie können diese Methode verwenden. Ich reihe die Zeilen und gebe dann die vor dem Fehler zurück.
%Vor%Tags und Links sql sql-server