根据以前的公式结果SQL Server的下一个公式结果

时间:2019-05-15 18:48:13

标签: sql sql-server-2012

我正在尝试在记录14-23的LAT值之间进行计算。

这是一个例子:

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上,则Previous表示记录14的前一个值。Current表示当前14记录的值,Next表示当前记录中的Next。

(NextAvailableLat - PrevLat) * ((CurrentODO - PrevODO) / 
(NextAvailableODO - PrevODO)) + PrevLat

(30.85633529 - 30.85629535) * ((33.95 - 33.94) / (48.38 - 33.94)) + 30.85629535

当我记录15时,我的公式将需要保留先前计算的LAT才能计算新的Lat

我尝试过使用一个传递ID的游标,它可以正常工作,但是当我进入大型数据集时,这会花费很长时间。一些批次具有接近1M的记录,这拖累了数小时。我希望有一条更新语句...但是我不知道如何保留以前的计算值。

我有一个包装在游标中的更新。光标通过ID

这是预期的结果:

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  

0 个答案:

没有答案