我应该使用光标吗?

时间:2015-09-01 14:24:24

标签: sql-server cursor

我有一个包含三个字段的表。组号,X-coord和Y-coord。每个组号中可以有0到10行。

我想要做的是计算每组内各点之间的最大和最小距离。显然,如果该组中有2行或更多行,这只会给你一个值。

输出应包括字段:组号,minDistance,maxDistance。

游标是否是一个很好的解决方案?

(坐标在WGS84中,我有一个计算距离的工作公式)

我使用游标的原因是我无法避免为每个组进行交叉连接,然后对交叉连接的每个结果应用公式。

1 个答案:

答案 0 :(得分:0)

我不会在你的情况下使用游标,但最好是在参数中使用所需组号的标量用户定义函数,并计算UDF中该组的最大距离。

请注意,函数内部的计算算法比您的计算算法简单得多。

create table dist (groupId int, X int, Y int)
insert into dist(groupid, x, y) values (1,14,20),(1,11,20),(1,10,22),(1,12,24),(1,11,28),(1,19,78)
insert into dist(groupid, x, y) values (2,10,20),(2,11,20),(2,10,22),(2,12,24),(2,11,28),(2,17,52)

create function dbo.getMinMaxDistanceForGroup (@groupId int)
    returns table as return (
        select MIN(SQRT(SQUARE(b.X - a.X) + SQUARE(b.Y - a.Y))) MinDistance, 
               MAX(SQRT(SQUARE(b.X - a.X) + SQUARE(b.Y - a.Y))) MaxDistance
                from dist a cross join dist b 
                where a.groupId = @groupId and b.groupId = @groupId
    )

select groupId, MinDistance, MaxDistance 
from dist OUTER APPLY dbo.getMinMaxDistanceForGroup(groupId) 
group by groupid, MinDistance, MaxDistance