在我的数据集中,有一组数字值与另一个表中另一个相同大小的值匹配,其中“最接近的匹配”(不需要更改):
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中使用。
答案 0 :(得分:0)
这样做你想要的吗?
select l.*,
(select max(r.right)
from right r
where r.right <= l.left
) as RightMatch
from left l;
注意:这只是SQL的草图。 left
和right
(显然)是保留字。我只是使用它们来匹配查询中的命名约定。不应对列或表名使用保留字。
答案 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 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或更高版本上可用
答案 2 :(得分:0)
我到目前为止最好的是:选择每组最大R(ight)的最大L(eft)(例如,AM)到另一个表中,从原始(临时副本)表中删除它,然后重复直到他们都匹配。这个解决方案非常具有程序性 - 可能不是很好的SQL风格。