Следующий результат формулы на основе предыдущего результата формулы SQL Server - PullRequest
0 голосов
/ 15 мая 2019

Я пытаюсь вычислить между значениями 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  
...