1

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

Left   Right
A      M
B      N
C      O
D      P

所以目标是从左到右连接,将 AM 作为结果行,其中 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。

4

3 回答 3

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 1和解决ORDER 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 或更高版本上可用

于 2014-06-19T15:51:42.420 回答
0

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

于 2014-06-21T03:04:42.787 回答
0

这是做你想做的吗?

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

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

于 2014-06-19T15:37:49.093 回答