这是我整天都在努力解决的一个非常有趣的问题。我有一张表,其中包含位置的ID,纬度和经度。这是来自较大位置集合的位置子集。

我想做的是使用位置的此子集,并针对每个位置,使用空中距离从较大的位置返回20英里以内的位置。我的问题不是计算空中距离,这是可行的,我的问题是如何像For循环那样在每行上进行操作,而是使用基于集合的方法。

所以说这是我的子集表LocationSubset

+----+---------+----------+
| ID |   Lat   |    Lon   |
+----+---------+----------+
| 1  | 41.0575 | -92.1364 |
+----+---------+----------+
| 2  | 47.0254 | -92.5723 |
+----+---------+----------+
| 3  | 38.9897 | -88.7623 |
+----+---------+----------+

我正在寻找更大的桌子,位置
+----+---------+-----------+
| ID |   Lat   |    Lon    |
+----+---------+-----------+
| 1  | 41.0575 | -92.1364  |
+----+---------+-----------+
| 2  | 47.0254 | -92.5723  |
+----+---------+-----------+
| 2  | 38.9897 | -88.7623  |
+----+---------+-----------+
| 4  | 36.2137 | -91.6528  |
+----+---------+-----------+
| 5  | 39.2643 | -123.0073 |
+----+---------+-----------+
| 6  | 39.941  | -123.0073 |
+----+---------+-----------+
| 7  | 35.7683 | -91.6528  |
+----+---------+-----------+
| 8  | 45.8406 | -91.6528  |
+----+---------+-----------+

假设使用Haversine公式,位置5和6在位置1的20英里范围内,位置4和8在位置2的20英里范围内。

我希望返回这样的内容:
+----+------------+----------+
| ID | LocationID | Distance |
+----+------------+----------+
| 1  | 5          | 15.4     |
+----+------------+----------+
| 1  | 6          | 16       |
+----+------------+----------+
| 2  | 4          | 17.4     |
+----+------------+----------+
| 2  | 8          | 2.5      |
+----+------------+----------+

每个位置在20英里范围内可能有零到许多位置,我正尝试在另一个表中捕获它。

如果需要,我可以添加说明。感谢您的时间。

最佳答案

SELECT
     LS.ID,
     L.ID as LocationID,
     MS_DISTANCE (LS.Lat , LS.Lon, L.Lat , L.Lon) as Distance
FROM LocationSubset LS
JOIN Locations L
  ON MS_DISTANCE (LS.Lat , LS.Lon, L.Lat , L.Lon) < 20
 AND LS.ID <> L.ID    -- if you want remove comparasion with same object
但是使用sql server空间函数可能会更好,因为这些函数允许使用空间索引。 Spatial Data

09-04 03:09