当前位置: 首页 > 面试题库 >

如何扩展此SQL查询以找到k个最近的邻居?

丌官嘉良
2023-03-14
问题内容

我有一个充满二维数据的数据库-地图上的点。每个记录都有一个几何类型的字段。我需要做的就是将一个点传递给存储过程,该存储过程返回 k个
最近的点(k也将传递给sproc,但这很容易)。我在http://blogs.msdn.com/isaac/archive/2008/10/23/nearest-
neighbors.aspx上
找到了一个查询,该查询可以获取最近的单个邻居,但是我不知道如何将其扩展到找到 k个 最近的邻居。

这是当前查询-T是表,g是geometry字段,@x是要搜索的点,Numbers是整数1到 n 的表:

DECLARE @start FLOAT = 1000; 
WITH NearestPoints AS
(
     SELECT TOP(1) WITH TIES *,  T.g.STDistance(@x) AS dist
     FROM Numbers JOIN T WITH(INDEX(spatial_index)) 
     ON T.g.STDistance(@x) < @start*POWER(2,Numbers.n)
     ORDER BY n
)
SELECT TOP(1) * FROM NearestPoints
ORDER BY n, dist

内部查询选择最近的非空区域,然后外部查询从该区域中选择最靠前的结果。外部查询可以很容易地更改为(eg)SELECT TOP(20),但是如果最近的区域仅包含一个结果,那么您将受此困扰。

我认为我可能需要递归搜索包含 k 条记录的第一个区域,但不使用表变量(这将导致维护问题,因为您必须创建表结构并且易于更改-字段很多),我看不出来


问题答案:

如果TOP (1) WITH TIES从内部查询中删除并设置外部查询以返回前 k 行,会发生什么情况?

我也想知道这项修正案是否有帮助。它应该比使用TOP以下命令更有效:

DECLARE @start FLOAT = 1000
        ,@k INT = 20
        ,@p FLOAT = 2;

WITH NearestPoints AS
(
     SELECT *
            ,T.g.STDistance(@x) AS dist
            ,ROW_NUMBER() OVER (ORDER BY T.g.STDistance(@x)) AS rn
     FROM Numbers 
     JOIN T WITH(INDEX(spatial_index)) 
     ON   T.g.STDistance(@x) <  @start*POWER(@p,Numbers.n)
     AND (Numbers.n - 1 = 0 
          OR T.g.STDistance(@x) >= @start*POWER(@p,Numbers.n - 1)
         )
)
SELECT * 
FROM NearestPoints
WHERE rn <= @k;

注意:未经测试-我无法在此处访问SQL 2008。



 类似资料:
  • 介绍 KNN算法全名为k-Nearest Neighbor,就是K最近邻的意思。KNN 也是一种分类算法。但是与之前说的决策树分类算法相比,这个算法算是最简单的一个了。算法的主要过程为: 1、给定一个训练集数据,每个训练集数据都是已经分好类的。 2、设定一个初始的测试数据a,计算a到训练集所有数据的欧几里得距离,并排序。                        3、选出训练集中离a距离最近的

  • k近邻(k-Nearest Neighbors)采用向量空间模型来分类,是一种常用的监督学习方法。它的工作原理为:给定测试样本,基于某种距离度量找出训练集中与其最靠近的k个训练样本,然后基于这k个“邻居”的信息来进行预测。通常,在分类任务中可使用“投票法”,即选择这k个样本中出现最多的类别标记作为预测结果;在回归任务中可使用“平均法”,即将这k个样本的实值输出标记的平均值作为预测结果;还可基于距离

  • 我正在尝试使用jgraph T解决一个链接预测问题。我正在根据两个节点的邻居计算两个节点之间的相似性。每个节点都有一些属性。计算变得太多了,因为一些节点有大约700个邻居,而我有4500个这样的节点。我有谁对的700K边,我计算相似性。 现在,我不想使用节点的所有邻居,我只想使用每个节点的k个最近邻居来计算一对节点之间的相似度。我可以根据边共享的两个节点的属性数,或节点之间长度为n的最短路径数等,

  • @subpage tutorial_py_knn_understanding_cn 了解kNN的基本知识。 @subpage tutorial_py_knn_opencv_cn 现在让我们在OpenCV中使用kNN进行数字识别(OCR)

  • 我在计算最近的邻居。为此,我需要传递一个参数来限制与邻居的最大距离。比如半径1000米内最近的邻居是哪些? 我做了以下工作: 我用以下数据创建了我的表: 之后,我执行了以下查询: 第一个问题,巴西的SRID是4326吗?4269是什么? 第二个问题,通过执行以下SQL 这不会返回任何结果。据我所知,这个SQL将进一步指出最大距离的半径,对吗? 如果你把1000个结果放在100000000,我的所有

  • k近邻模型 $$k$$近邻(k-Nearest Neighbor,简称kNN)学习是一种常用的监督式学习方法,其工作机制非常简单: 给定测试样本,基于某种距离度量找出训练集中与其最靠近的$$k$$个训练样本,然后基于这$$k$$个“邻居”的信息来进行预测。通常,在分类任务中可使用“投票法”,即选择这$$k$$个样本中出现最多的类别标记作为预测结果;在回归任务中可以使用“平均法”,即将这$$k$$个