SQL Server 2012 地理 - 找到最少的多行
Posted
技术标签:
【中文标题】SQL Server 2012 地理 - 找到最少的多行【英文标题】:SQL Server 2012 geography - find minimum of multiple rows 【发布时间】:2012-10-04 15:49:43 【问题描述】:我正在尝试查找距犯罪地点最近的自行车架的距离。我有一个包含 500 万起犯罪和 5,000 个自行车架的数据库表。我现在需要做的是找到离这 500 万起犯罪事件最近的自行车架。我尝试使用 geopy 创建一个 python 脚本,但处理起来太耗时了(至少需要几周时间)。我一直在网上广泛搜索,我发现 SQL Server 2012 有一个地理数据类型,所以我创建了一个列,其中包含来自犯罪和自行车架的纬度和经度点的地理数据类型。
现在我正在尝试做这样的事情:
update Crimes set distanceToNearestBikeRack = crimeGeo.STDistance((select geo from bike_racks))
不幸的是,这会导致子查询返回许多行并抛出:
消息 512,级别 16,状态 1,第 1 行子查询返回超过 1 个 价值。当子查询跟随 =、!=、、>= 时,这是不允许的 或者当子查询用作表达式时。该语句已终止。
如何从众多点中找到最近的点?
【问题讨论】:
【参考方案1】:通常您会使用MIN
来找到一组值的最小值,但它似乎不适用于空间方法。但是,这可行:
UPDATE
Crimes
SET
distanceToNearestBikeRack =
(SELECT TOP 1 crimeGeo.STDistance(BR.geo)
FROM bike_racks BR
ORDER BY crimeGeo.STDistance(BR.geo) ASC)
当然,有 500 万犯罪和 5000 个自行车架,这可能需要……一段时间。因此,您可能需要考虑批量更新。
【讨论】:
这太完美了!!!正是我想要的。谢谢!我在更新中添加了一批。【参考方案2】:您显然需要对每个犯罪地点进行一次计算,并且子查询需要有关犯罪地点的信息才能找到最近的自行车架。
我没有研究过 SQL 2012,但在过去,人们会使用 Haversine 公式,它实际上非常快。 看答案 Geolocation and Haversine formula,或者我几年前对 How to calculate distance from a GPX file? 的回答,用于 UDF 实现。
【讨论】:
以上是关于SQL Server 2012 地理 - 找到最少的多行的主要内容,如果未能解决你的问题,请参考以下文章
sql server, 已知两组地理位置数据,求第一组每个地理位置2km以内第二组地理位置的个数
在 sql server 2008 中使用地理数据类型的两点之间的距离?