这是我整天都在努力解决的一个非常有趣的问题。我有一张表,其中包含位置的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