丢弃统计上不重要的数据对人类来说很容易,但对计算机来说可能有点麻烦。在您的情况下尤其如此,因为您正在处理两个维度(纬度和经度)。
我建议您看一下我几年前写的这篇博客:使用 SQL Server 计算平均中位数和众数。
对于纬度和经度,小数点后的每个数字代表一个距离。您可以做的是将纬度和经度四舍五入到一定的小数位,找到模式。去掉与众数不一样的点,然后对剩余的未取整项进行平均。
由于您在二维中工作,因此您需要分别对纬度和经度值执行此操作,因为纬度可能会偏离而经度不是(这将代表实际位置以北或以南的坏点)。同样,经度可能会偏离,而纬度显然还可以。如果任何一个值都是“坏的”,那么您应该完全放弃这一点。
这是我正在谈论的一个例子:
Declare @Temp Table(Lat Decimal(9,6), Lon Decimal(9,6))
Insert Into @Temp Values(20.12341, 10.98731)
Insert Into @Temp Values(20.12342, 10.98732)
Insert Into @Temp Values(20.12343, 10.98733)
Insert Into @Temp Values(20.12344, 10.98734)
Insert Into @Temp Values(20.12344, 10.68734) -- Latitude OK, Longitude bad
Insert Into @Temp Values(20.32344, 10.98734) -- Longitude OK, Latitude bad
Insert Into @Temp Values(20.42340, 10.68730) -- Both are bad
Select Avg(Lat), Avg(Lon)
From @Temp
Select Avg(T.Lat) As Latitude,
Avg(T.Lon) As Longitude
From @Temp T
Inner Join (
-- Calculate the mode for the latitude
Select Top 1 Convert(Decimal(9,4), Lat) As ModeOfLat
From @Temp
Group By Convert(Decimal(9,4), Lat)
Order By Count(*) DESC
) As Latitudes
On Convert(Decimal(9,4), Lat) = Latitudes.ModeOfLat
Inner Join (
-- Calculate the mode for the longitude
Select Top 1 Convert(Decimal(9,4), Lon) As ModeOfLon
From @Temp
Group By Convert(Decimal(9,4), Lon)
Order By Count(*) DESC
) As Longitudes
On Convert(Decimal(9,4), Lon) = Longitudes.ModeOfLon
如果您在 SQL Server Management Studio 窗口中运行上述查询,您将看到简单平均与模式+平均方法有很大不同。
由于这是一种基于集合的方法,它应该比循环/光标方法快得多。