【问题标题】:SQL Server Query Spatial Data for Nearest Neighbor DISTINCT TOP N ORDER BY DistanceSQL Server 查询最近邻居 DISTINCT TOP N ORDER BY 距离的空间数据
【发布时间】:2017-07-30 09:07:54
【问题描述】:

我想知道是否有办法从空间数据列中查询最近的 N 个邻居,丢弃重复项。

例如,我的查询如下所示:

SELECT TOP (@N) Point.STDistance(@Point) AS Distance
FROM MyTable
WHERE Point.STDistance(@Point) IS NOT NULL --For Spatial Index usage
ORDER BY Distance;

它非常有效,但我的结果是:

Distance
3906,81969203873
3906,81969203873
5321,62614141754
5756,28719382942

我试图放置一个 DISTINCT 子句,但它没有使用空间索引。

有什么想法吗?

谢谢

【问题讨论】:

  • 当您说丢弃重复项时,您是指重复点还是重复距离?两点之间的距离相同是完全可行的。如果您正在寻找独特点的列表,只需在 MyTable 的过滤版本上运行您的 top N
  • 假设重复的距离。我不能拥有MyTable 的过滤版本,因为它有数百万行
  • 为什么不能过滤?除了空间点之外,您不保存纬度和经度值吗?或者除了空间点本身之外,还有关于该点所在位置的任何其他识别信息?
  • 将此结果插入临时表,然后从临时表中选择distinct行。
  • 如果我将它插入到临时表中然后过滤,我将获得的行数将低于@N

标签: sql-server spatial nearest-neighbor


【解决方案1】:

根据Nearest Neighbor Query and Spatial Indexes 上的MSDN 描述,您需要在ORDER BY 子句中使用STDistance()

  1. ORDER BY 子句中的第一个表达式必须使用 STDistance() 方法。

  2. ORDER BY 子句中第一个 STDistance() 表达式的排序顺序必须为 ASC。

您可能需要使用GROUP BYCTEsubquery 以避免任何潜在的重复。

【讨论】:

  • 我不需要在ORDER BY 中指定STDistance(),因为我是通过Distance 订购的,它是Point.STDistance(@Point) 的别名
  • 如果我使用GROUP BY,或CTE,或子查询,则不使用空间索引
  • @JesúsMuelaIzquierdo,您能否发布测试表脚本,以及测试数据插入脚本来模拟您的问题并为您提供帮助?还请告诉我们您使用的是哪个版本的 SQL Server?
【解决方案2】:

由于您的表设计或数据库设计,存在递归记录。如果您共享数据库或表架构可以回答更准确。使用内部选择干净的递归记录,然后应用距离函数来获取距离。它将使用空间索引。

【讨论】:

  • 这是如何递归的?对我来说,这似乎是一个简单的空间查询。
  • 3906,81969203873 3906,81969203873 这两个对我来说看起来很相似,这意味着在同一个记录上重复工作。不要像数据库上的经典编程逻辑那样思考。术语表达不同的事物。祝你好运
  • 类似的 != 递归的。此外,鉴于原始海报中的问题陈述,他可能对表中的数据几乎没有控制权(即,它将类似于行的“咖啡店位置”)。你会如何建议他摆脱“相似”的数据,并且不要忘记这样一个事实,即使用我的人为示例,有两家咖啡店紧挨着彼此?
  • 你为什么想得这么复杂。:) 我只是说,使用内部选择只获取意图记录,然后应用地理功能。怎么了 ?如果所有问题都是递归的!=similer 是的,这是真的,但更相似的记录会导致递归工作 man :) (实际上在 sql server 的中间层而不是 oracle)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-02-11
  • 2012-08-10
  • 2015-12-02
  • 2019-06-05
  • 1970-01-01
  • 2011-11-12
相关资源
最近更新 更多