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 № 1Sie 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