Я пытаюсь вычислить между значениями LAT записей 14-23.
Вот пример:
Id LAT ODO
13 30.85629535 33.95
14 33.95
15 36.32
16 36.57
17 38.69
18 39.63
19 39.87
20 41.22
21 41.62
22 44.6
23 46.21
24 30.85633529 48.38
Если предположить, что мы находимся на записи 14, то предыдущая означает значение, предшествующее записи 14. Текущий означает текущее значение 14 записи, следующее - следующее доступноеиз текущей записи.
(NextAvailableLat - PrevLat) * ((CurrentODO - PrevODO) /
(NextAvailableODO - PrevODO)) + PrevLat
(30.85633529 - 30.85629535) * ((33.95 - 33.94) / (48.38 - 33.94)) + 30.85629535
Когда я доберусь до записи 15, моя формула должна будет сохранить предыдущий вычисленный LAT, чтобы вычислить новый Lat
, который я пробовал с курсоромв котором я передаю идентификатор, и это прекрасно работает, однако, когда я получаю большие наборы данных, это занимает очень много времени.Некоторые партии имеют записи около 1М, которые тянутся часами.Я надеялся на утверждение обновления ... но я не могу понять, как сохранить это предыдущее вычисленное значение.
У меня есть обновление, обернутое в курсор.Курсор передает идентификатор
Это ожидаемые результаты:
Id LAT ODO
13 30.85629535 33.95
14 30.85629535 33.95
15 30.85630191 36.32
16 30.8563026 36.57
17 30.85630847 38.69
18 30.85631107 39.63
19 30.85631173 39.87
20 30.85631547 41.22
21 30.85631658 41.62
22 30.85632483 44.6
23 30.85632929 46.21
24 30.85633529 48.38
Скрипт для вставки данных:
CREATE table dbo.Lats
(ID int
, LAT decimal(14,8)
,ODO decimal(10,2))
INSERT INTO dbo.Lats
select * from (
select 13 ID, 30.85629535 LAT, 33.95 ODO
union
select 14, null, 33.95
union
select 15, null, 36.32
union
select 16, null, 36.57
union
select 17, null, 38.69
union
select 18, null, 39.63
union
select 19, null, 39.87
union
select 20, null, 41.22
union
select 21, null, 41.62
union
select 22, null, 44.6
union
select 23, null, 46.21
union
select 24, 30.85633529 ,48.38) lats
order by ID
Ниже приведен цикл while, который я использовал для получениярезультаты:
declare @minid int ,@maxid int, @currentID int
set @minid =13
set @maxid = 24
set @currentID = 14
WHILE @currentID <@maxid
BEGIN
DECLARE @NextLat decimal(14,8) , @PrevLat decimal(14,8) , @PrevODO decimal(10,2) , @CurrentODO decimal(10,2) , @NextODO decimal(10,2)
select @NextLat = LAT from dbo.Lats where id = @maxid
select @PrevLat = LAT from dbo.Lats where id = @currentID - 1
select @PrevODO = odo from dbo.Lats where id = @currentID - 1
select @CurrentODO = odo from dbo.Lats where id =@currentID
select @NextODO = odo from dbo.Lats where id =@maxid
update dbo.Lats
set LAT = ((@NextLat - @PrevLat) * ((@CurrentODO - @PrevODO) (@NextODO - @PrevODO)) + @PrevLat)
from dbo.Lats
where ID = @currentID
set @currentID = @currentID + 1
END