У меня есть таблица, в которой хранится информация о местонахождении и метке времени из модуля GPS.Таблица выглядит примерно так:
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)
Вы заметите, что некоторые точки данных имеют значения широты и долготы, равные 0, поскольку у модуля GPS нет фиксированного значения в данный момент.При извлечении точек данных из этой таблицы я хотел бы установить для всех значений нулевой широты и долготы последние ненулевые значения широты и долготы.В настоящее время я делаю это в своем клиентском коде, но я хотел бы интегрировать это в хранимые процедуры моей базы данных.Код на стороне клиента выглядит примерно так:
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
Приведенное выше может привести к следующим результатам со стрелками, указывающими на ранее нулевые местоположения:
('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)
Как бы яидти о реализации этой же функции в SQL?
Добавление: Спасибо за все ответы до сих пор.Я должен отметить, что я не заинтересован в обновлении исходной таблицы - я хотел бы только изменить результаты запроса.Причина этого в том, что строки в таблице не добавляются в хронологическом порядке.