我有两个这样的表:
表实验(我现在只使用一个 roadID (rID))
rID | latBegin |longBegin |latEnd |longEnd
041 | 23.875464|-80.456798|30.549879|-83.5465521
041 | 33.776563|-81.157526|33.248261|-81.2468425
对于上述每一行,我希望光标获取 rID、latBegin、longBegin 并在Table ExperimentDetails中检查 lat 和 long 的距离
rID | lat |long |temp |direction|tension
041 | 33.665632|-81.137952|56.23|L |54.54
041 | 23.245632|-80.127952|56.23|L |23.54
041 | 23.454555|-80.232456|66.23|L |13.54
041 | 23.568763|-80.346586|26.23|L |63.54
041 | 23.796545|-80.446586|86.23|L |83.54
041 | 23.996545|-80.946586|96.23|L |22.54
查询的步骤是:
第 1 步:从 Table Experiment 中获取特定 rID 的 latBegin 和 longBegin
第 2 步:转到 ExperimentDetails 并运行此计算以获取 Details 表中每个 lat 和 long 的距离差
Round(Sqrt(POWER((Abs(lat - @latBegin)),2) + POWER((Abs(long - @longBegin)),2)) * 3958.73926185, 4) * 1000
第 3 步:在详细信息表中获取此新关联列的最小值
第 4 步:获取该最小值的关联温度、方向和张力值并将其放入新表中(尚未完成>需要帮助)
第 5 步:从最小值获取前 30 英尺或 360 英寸的温度、张力平均值并将其放在另一个表中(列:rID、latBegin、longBegin、avgTension、avgtemp 尚未完成>需要帮助)
到目前为止,这是我的代码:
DECLARE @rID int,@latBegin decimal(15,10),@longBegin decimal(15,10),@minV decimal(15,10),@temp decimal(15,10)
DECLARE MY_CURSOR CURSOR
LOCAL STATIC READ_ONLY FORWARD_ONLY
FOR
SELECT DISTINCT rid,latbeg,longbeg
FROM dbo.Experiment
WHERE rID='041'
OPEN MY_CURSOR
FETCH NEXT FROM MY_CURSOR INTO @rID,@latBegin,@longBegin
WHILE @@FETCH_STATUS = 0
BEGIN
SELECT @minV=Min(Round(Sqrt(POWER((Abs(lat - @latBegin)),2) + POWER((Abs(long - @longBegin)),2)) * 3958.73926185, 4) * 1000,latitude) over (Partition by rID Order by rID)
, @temp=temp
FROM dbo.ExperimentDetails
WHERE rid='041'
Insert into dbo.Test(rid,lat,lon,min,temp) values (@rid,@latBegin,@longBegin,@minV,@temp)
FETCH NEXT FROM MY_CURSOR INTO @rID,@latBegin,@longBegin
END
CLOSE MY_CURSOR
DEALLOCATE MY_CURSOR
测试表如下所示:
rID|lat |long |min |temp
041|23.875464|-80.456798|12.1|96.23
041|33.776563|-81.157526|11.0|96.23
最后一行重复临时数据,不正确
它应该如下所示:
rID|lat |long |min |temp
041|23.875464|-80.456798|12.1|83.54
041|33.776563|-81.157526|11.0|54.54
我已经提供了尽可能多的信息,但是如果您需要更多信息,请询问,将不胜感激,从昨天开始就一直在努力解决这个问题。目前,除了@minV 之外,我还试图引入温度、方向和张力,但它不允许我这样做
对于第 5 步:对于详细信息表,光标中的计算理论上如下所示:
rID |lat |long |temp |DISTDIFF
041 | 23.245632|-80.127952|56.23|372.12
041 | 23.454555|-80.232456|66.23|300.22
041 | 23.568763|-80.346586|26.23|50.48
041 | 23.796545|-80.446586|86.23|12.10
然后在插入时检查最小值,即 12.10 并插入与该行相关的值。
对于第 5 步,我需要在最小值之前而不是之后找到最接近 360 的值(之后可能还有更接近的其他值),在本例中为 372.12,然后取 temp 的平均值,如下所示:
rID |minlat |minlong |lastlat |lastlong |Avgtemp
041 | 23.796545|-80.446586|23.245632|-80.127952|58.73
使用 SQL Server 2014
我想我有一个解决方案给你......但是!重要提示:您没有考虑在 DETAIL 中有超过 1 条等于最小值的记录...您还缺少 TEST 表中的 TENSION 列
无论如何,要回答您的问题,请尝试替换它:
有了这个:
祝你好运!
---对于第 5 步 -----
首先,我假设您已经创建了另一个表,比如说:Temp360
因此,在 DECLARE 区域中包含另外 2 个变量...假设:@min360 decimal(15,10) 和 @avgtemp decimal(15,10)
然后在光标循环中使用此代码: