我正在尝试在记录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