/ / SQL Server 2008: Durchlaufen der Ergebnisse von SELECT +, wobei andere Abfragen abhängig von der Position in der Schleife und dem Ergebnis ausgeführt werden - sql, sql-server-2008

SQL Server 2008: Durchgehen der Ergebnisse von SELECT + Durchführen anderer Abfragen in Abhängigkeit von Position in Schleife und Ergebnis - SQL, SQL-Server-2008

Ich habe eine Tabelle mit den Standort- und Zeitstempelinformationen eines GPS-Moduls. Die Tabelle sieht ungefähr so ​​aus:

declare @VehicleData table
(
[TimeStamp] DateTime,
Latitude float,
Longitude float
)

insert into @VehicleData
values  ("2012/03/06 10:00", 1, 1),
("2012/03/06 10:01", 1, 2),
("2012/03/06 11:00", 0, 0),
("2012/03/06 11:01", 0, 0),
("2012/03/06 11:02", 2, 2),
("2012/03/06 11:03", 2, 2),
("2012/03/06 11:04", 2, 3),
("2012/03/06 11:20", 0, 0),
("2012/03/06 11:21", 5, 5),
("2012/03/06 11:22", 5, 6),
("2012/03/06 11:23", 5, 6),
("2012/03/06 11:24", 5, 7),
("2012/03/06 11:25", 5, 8)

Sie werden feststellen, dass einige der Datenpunkte habenBreiten- und Längenwerte von 0, aufgrund des GPS-Moduls, sind derzeit nicht festgelegt. Was ich beim Abrufen von Datenpunkten aus dieser Tabelle tun möchte, ist, alle Breiten- und Längengrade von Null auf die letzten Breiten- und Längengrade ungleich Null zu setzen. Ich mache dies derzeit in meinem clientseitigen Code, aber ich möchte Integrieren Sie dies in meine Datenbank gespeicherte Prozeduren. Der clientseitige Code sieht ungefähr so ​​aus:

Dim StartDate = "2012/03/06 11:00"
Dim EndDate = "2012/03/06 11:25"

Dim Results = GetVehicleDataBetweenDates(StartDate, EndDate)

Dim LastKnownLatitude = 0, LastKnownLongitude = 0

If Results(0).Latitude = 0 Then
"Query database for last non-zero position before StartDate
GetLastKnownPositionBeforeDate(StartDate, LastKnownLatitude , LastKnownLongitude )
Else
LastKnownLatitude = Results(0).Latitude
LastKnownLongitude = Results(0).Longitude
EndIf

For i = 0 to Results.Count - 1
If Results(i).Latitude = 0 Then
Results(i).Latitude = LastKnownLatitude
Results(i).Longitude = LastKnownLongitude
Else
LastKnownLatitude = Results(i).Latitude
LastKnownLongitude = Results(i).Longitude
EndIf
Next

Das oben Genannte könnte zu den folgenden Ergebnissen führen, wobei die Pfeile auf die zuvor Null-Positionen zeigen:

("2012/03/06 11:00", 1, 2), <--
("2012/03/06 11:01", 1, 2), <--
("2012/03/06 11:02", 2, 2),
("2012/03/06 11:03", 2, 2),
("2012/03/06 11:04", 2, 3),
("2012/03/06 11:20", 2, 3), <--
("2012/03/06 11:21", 5, 5),
("2012/03/06 11:22", 5, 6),
("2012/03/06 11:23", 5, 6),
("2012/03/06 11:24", 5, 7),
("2012/03/06 11:25", 5, 8)

Wie würde ich vorgehen, um dieselbe Funktionalität in SQL zu implementieren?

Nachtrag: Vielen Dank für alle bisherigen Antworten. Ich möchte darauf hinweisen, dass ich nicht daran interessiert bin, die ursprüngliche Tabelle zu aktualisieren - ich möchte nur die Ergebnisse der Abfrage ändern. Der Grund dafür ist, dass die Zeilen in der Tabelle nicht in chronologischer Reihenfolge hinzugefügt werden.

Antworten:

2 für die Antwort № 1

Sie können Tabelle abfragen, um die letzte bekannte Position zu erhalten:

select
[timestamp],
case
when latitude>0 then latitude
else (select top 1 latitude
from @VehicleData v2
where
latitude > 0 and
v2.[TimeStamp] < v1.[TimeStamp]
order by v2.[TimeStamp] desc )
end
as latitude
from
@VehicleData v1

Das Beispiel bezieht sich auf den Breitengrad. Führen Sie dieselbe Unterabfrage aus, um den Längengrad zu ermitteln.


2 für die Antwort № 2

Vielleicht ein bisschen chaotisch, aber wenn Sie diese beiden Befehle in Ihre SQL einfügen, tun Sie das, was Sie brauchen:

UPDATE V
SET Latitude = (SELECT Latitude FROM @VehicleData WHERE [TimeStamp] = (SELECT MAX([TimeStamp]) FROM @VehicleData WHERE [TimeStamp] < V.[TimeStamp] AND [Latitude] <> 0))
FROM @VehicleData V
WHERE Latitude = 0

UPDATE V
SET Longitude = (SELECT Longitude FROM @VehicleData WHERE [TimeStamp] = (SELECT MAX([TimeStamp]) FROM @VehicleData WHERE [TimeStamp] < V.[TimeStamp] AND [Longitude] <> 0))
FROM @VehicleData V
WHERE Longitude = 0

Hoffe das hilft.

Hier ist meine Ergebnismenge:

2012-03-06 10:00 | 1 | 1
2012-03-06 10:01 | 1 | 2
2012-03-06 11:00 | 1 | 2
2012-03-06 11:01 | 1 | 2
2012-03-06 11:02 | 2 | 2
2012-03-06 11:03 | 2 | 2
2012-03-06 11:04 | 2 | 3
2012-03-06 11:20 | 2 | 3
2012-03-06 11:21 | 5 | 5
2012-03-06 11:22 | 5 | 6
2012-03-06 11:23 | 5 | 6
2012-03-06 11:24 | 5 | 7
2012-03-06 11:25 | 5 | 8

0 für die Antwort № 3
update  V
set latitude= (select top 1 latitude from VehicleData V2 where v2.timestamp < v.timestamp  and latitude!= 0 order by v2.timestamp desc),
longitude= (select top 1 longitude from VehicleData V2 where v2.timestamp < v.timestamp and longitude !=0 order by v2.timestamp desc)
from VehicleData V
where V.latitude=0 and V.longitude=0