如何按最佳匹配排序?

时间:2017-09-11 14:40:43

标签: sql algorithm sorting

我有一个查询,我希望结果尽可能接近条件匹配。

例如,如果我有条件" a" = 500,然后应该对返回的结果进行排序,以便我得到500,499,501,498,502等等。从提供的值扩展到(正面和负面)两边,如树。 / p>

select val, abs(500 - val) as num from foo order by num asc, val asc limit 10;

之类的内容很简单

现在我想要实现的是应用多个这样的条件(排序),这不是问题但是我最终想要的是获得与所提供条件的最佳匹配。

只是添加这些排序意味着结果将按第一个字段正确排序,然后如果第二个字段的每个值都有重复,依此类推,这主要意味着第一个排序是指示顺序。

我想到的是让这些中的每一种都具有重量"并且结果应该按照一起计算的所有权重进行排序。

因此,例如,如果一个记录匹配第一个排序的差异为2(我查找500但记录有488),第二个排序差异为100(我查找200并且记录有值100)和第二记录匹配首先按1排序(我正在寻找500并且记录具有值501)并且第二排序由差异105(我寻找200并且记录具有值305)第二排序记录将首先根据第一种排序(因为1小于2),但第一种记录,即使第一种记录在第二种排序上相差2,相差100,而第二种记录则为105。所以第一条记录实际上比第二条记录更符合标准。

因此,仅仅将差异统计在一起并不是一个好方法(因为每种方式和差异都有不同的权重)。所以我想知道什么是正确的解决方案?

这很难用语言解释,所以如果仍然不清楚,请告诉我,我会以某种方式尝试不同的解释。

编辑:为了清楚起见,这些值没有标准单位。它们是不同的单位,数字,尺度......正如我所提到的那样。我认为百分比必须来到某个地方。像select val, valB, ((abs(500 - val) / (500 / 100)) + (abs(200 - valB) / (200 / 100))) as rank from foo order by rank asc;

这样的东西

2 个答案:

答案 0 :(得分:2)

考虑每个记录K维空间中的一个点,属性{val 1 ,val 2 ,...,val k 考虑所需的值组合另一点,属性{search 1 ,搜索 2 ,...,搜索 k }

对点进行排序的一种方法是它们与搜索点的距离,即平方成对差异之和的平方根:

ORDER BY 
    POW(val1-search1, 2)
+   POW(val2-search2, 2)
+   ...
+   POW(valK-searchK, 2)

这是平方Euclidean distance in K dimensions的公式。我们不需要取平方根,因为我们只使用距离进行排序,而实际值则被丢弃。

  

如果一个字段以米为单位而另一个字段以千米为单位(或货币,或升或任何其他单位,如果有),那么这将无效

你需要通过引入重量来“均匀化”你的空间。对于相同类型的测量,例如米和公里,这可以通过将米的重量设置为10 -6 ,或将公里的重量设置为10 6 来完成。

对于不同类型的措施,例如米和货币,你需要决定你希望分配给每个仪表的价值,并使用系数的平方作为相应的权重。

答案 1 :(得分:0)

Dasblinkenlight的解决方案使用标准的欧几里德距离。关于适合这种差异的指标,在​​统计学和数学方面有很多工作。

另一种方法是曼哈顿距离。这只是绝对值的平方和:

order by (abs(val1 - search1) +
          abs(val2 - search2) +
          . . .
          abs(valk - searchk)
         )

根据具体情况,可能需要采用卡方或皮尔逊相关等统计指标。

此外,这个和欧几里德版都假设不同的尺寸具有相似的尺度。在实践中,您可能希望标准化值(减去平均值并除以标准差),因此所有维度都具有相似的范围。