【问题标题】:How do I calculate the distance of each row in an SQL table with all the rows of another table?如何计算 SQL 表中的每一行与另一个表的所有行的距离?
【发布时间】:2021-01-31 16:48:53
【问题描述】:

我有三个 SQL 表:

  1. 具有经纬度坐标的 10 万个气象站列表
  2. 带有经纬度坐标的 15 个感兴趣城市的列表
  3. 每个气象站的天气数据列表

我现在只对前两张桌子感兴趣。如何将气象站列表过滤到例如每个感兴趣的城市 100 公里?

我有一个 Microsoft SQL Server,如果可能的话,我更愿意在 SQL 中完成。

【问题讨论】:

  • 它有帮助 - 谢谢 - 但这只是解决方案的一小部分。更大的问题是如何解决这个问题。我可以在 T-SQL 中执行此操作,还是需要 Python 或 Go 代码?如果我在 T-SQL 中执行此操作,是否有一个不错的基于集合的解决方案,或者我是否需要使用游标并遍历每一行,这非常慢?

标签: sql sql-server


【解决方案1】:

基本上,如果您自己尝试这样做,您最终会得到笛卡尔积:

select c.*, ws.*
from cities c cross apply
     (select ws.*
      from (select ws.*, 
                    <complicated expression to calculate distance> as distance
            from weather_station ws 
           ) ws
      where distance < 100
     ) ws;

为了获得气象站列表,所有个城市和气象站必须进行比较。距离计算通常相当昂贵,因此您可以通过“预过滤”来减少它。例如,在大多数有人居住的地方,100公里在1度纬度和2度经度以内:

select c.*, ws.*
from cities c cross apply
     (select ws.*
      from (select ws.*, 
                    <complicated expression to calculate distance> as distance
            from weather_station ws 
            where ws.latitutde between c.latitude - 1 and c.latitude + 1 and
                  ws.longitude between c.longitude - 2 and c.longitude + 2
           ) ws
      where distance < 100
     ) ws;

尽管这有帮助,但这本质上仍然是一个过滤的笛卡尔积。

那么,你真的应该怎么做?如果您关心作为空间数据的坐标,则应查看 SQL Server 的空间扩展(文档为 here,尤其是 geography 类型,因为这与您的需求最相关)。

【讨论】:

    【解决方案2】:

    正如 Gordon 所说,您可以根据需要定义 spatial geography datatype。您可以按照以下步骤来实现目标。

    1. 将经纬度数据存储在Point
    2. 现在,使用STDistance 计算两点之间的距离
    3. 您可以利用finding nearest neighbor 的常见场景

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-09-23
      • 2014-04-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-11
      • 1970-01-01
      • 2013-06-04
      相关资源
      最近更新 更多