是否可以在TSQL / SQL中执行最近邻(模糊)查询

时间:2018-04-12 14:35:19

标签: sql-server tsql

我正在对棒球数据库运行查询,并想知道是否有可能编写一个返回最近邻居(前20到50位)棒球运动员的查询,其统计数据和人口统计信息最接近Where子句中包含的内容查询。例如,

Select Top 20 Player_ID, Player_FullName 
From BaseballDB
Where Age = 23 And BattingAvg = 250 And OPS = 100

我在查询中使用了相同的符号,虽然我试图实现的价值实际上并不一定要相等我只是在寻找接近于我的Where子句中包含的维度的交集。

我熟悉预测分析中的最近邻分析,但我很好奇是否有可能实现与SQL类似的东西。

2 个答案:

答案 0 :(得分:4)

是的,但您需要定义距离指标。最近邻居不是一种特殊的方法;这取决于指标的定义。

例如,一个指标是曼哈顿距离。这将实现为:

select top (25) b.*
from baseballDB b 
order by abs(age - 23) + abs(battingavg - 250) + abs(ops - 100);

如果您对值进行平方而不是使用abs(),则您具有熟悉的欧几里德度量(排序时不需要平方根)。

由于各种原因,曼哈顿距离可能不适合此数据(不同的列具有不同的范围)。但这显示了如何在数据库中实现最近邻居。

我应该指出,数据库通常不会针对此类查询进行优化,因此需要对所有数据进行排序。有一些方法可以优化最近邻居,但这些优化通常在数据库中不适用于定制指标。

答案 1 :(得分:0)

我想我会做类似的事情 把它提升到一个力量,所以任何一个的巨大差异都会产生很大的不同 划分为标准化

declare @Age int = 23, @Bat int = 250, @OPS int = 10, @pw float = 2;

select Top 20 Player_ID, Player_FullName 
from BaseballDB
order by (@Age + power(abs(@Age - age), @pw)) / @Age 
       + (@Bat + power(abs(@Bat - bat), @pw)) / @Bat
       + (@OPS + power(abs(@OPS - OPS), @pw)) / @OPS  desc