SQL:匹配近似值集

时间:2014-06-19 15:21:42

标签: sql sql-server join approximate

在我的数据集中,有一组数字值与另一个表中另一个相同大小的值匹配,其中“最接近的匹配”(不需要更改):

Left   Right
A      M
B      N
C      O
D      P

所以目标是从左到右连接,将A M作为结果行,其中A< M和M - A是MINIMUM [M..P - A]。

(忽略A..D和M..P可能有多个具有相同值的元素。)

编辑:类似地,B需要匹配N,C到O,D到P。

表会有多组这样的值,这样E..G就会匹配Q..S,但是这些会在未显示的其他字段的单独组中。

可能有许多匹配的“套”(基于表中的其他字段。

建议或想法?最好在T-SQL或基本SQL中使用。

3 个答案:

答案 0 :(得分:0)

这样做你想要的吗?

select l.*,
       (select max(r.right)
        from right r
        where r.right <= l.left
       ) as RightMatch
from left l;

注意:这只是SQL的草图。 leftright(显然)是保留字。我只是使用它们来匹配查询中的命名约定。不应对列或表名使用保留字。

答案 1 :(得分:0)

如果我理解正确[left][right]位于不同的表格

SELECT l.Value, r.Value rValue
FROM   [LEFT] l
       CROSS APPLY (SELECT TOP 1 
                           Value
                    FROM   [Right] r
                    WHERE  l.value < r.value
                    ORDER BY Value) r

公式的最小部分由TOP 1ORDER BY解决。

使用此查询,所有值A..D将与M匹配,因为它们都少于M而M对每个人都是封闭的,所以可能所述算法缺少一些规则。


如果您想要一个zip连接,那么一种方法是创建按值排序的行号并按这些数字连接

WITH LID AS (
  SELECT Value
       , _ID = Row_Number() OVER (ORDER BY Value)
  FROM   [LEFT]
, RID AS (
  SELECT Value
       , _ID = Row_Number() OVER (ORDER BY Value)
  FROM   [RIGHT]
)
SELECT l.Value, r.Value
FROM   LID l
       INNER JOIN RID r ON LID._ID = RID._ID

ROW_NUMBER在SQLServer 2005或更高版本上可用

答案 2 :(得分:0)

我到目前为止最好的是:选择每组最大R(ight)的最大L(eft)(例如,AM)到另一个表中,从原始(临时副本)表中删除它,然后重复直到他们都匹配。这个解决方案非常具有程序性 - 可能不是很好的SQL风格。