2011-05-19 114 views
5

选择行我与SQL非常强大,但我想不出很好的解决这个“相似”的数据分析问题:与最小差

给定一个表是一个整数集,我需要将每个整数与第二个表中最相似(最小绝对差)的整数进行匹配。通常我会做一个笛卡尔连接,并按照数字的不同进行排序,但是我只需要从每个表中获得每行的一个配对,所以两个表中的任何值都不能使用两次。

任何想法如何做到这一点?

编辑:实施例:

TABLE_A

34 
57 
108 
219 
380 
5000 

表-B

4000 
200 
400 
99 
40 
33 
34 
4600 

配对将是从表-A一个行并从表-B最近的行:

RESULT

34,34 
57,40 
108,99 
219,200 
380,400 
5000,4600 

因此,任何一个表的行都不会出现两次。

编辑:更多解释:我试图解决这个问题,从table_a给出1行,我们发现table_b中最接近的1行。这成为一对,并被删除。然后从table_a中取下一行并重复。所以我们试图为每一行找到最佳匹配并优化配对,而不是试图优化总体差异。

+0

“...每个表格的每行有一个分区...”令人困惑。它是“在第一个表格中获取每个值并在第二个表格中找到最接近的值”?还是有一些要求,第二个表中的每个值都必须出现在列表中,否则必须出现在最终集合中?也许一个小例子会有所帮助 – 2011-05-19 18:37:43

+0

您可以添加示例数据来帮助我们可视化输入和输出吗?我们可以假设整数在每个表中都是唯一的吗?一张桌子上有5张和7张,另一张是6张? 6应该出现两次,因为它接近于5和7 – gbn 2011-05-19 18:38:20

+0

如果您正在寻找组合之间总差异最小的解决方案,那么如果您在一个表中有5个和8个,第二个表中有7个和15个,那么(5,7),(8,15)。 ((7-5)+(15-8))== 9,但((8-7)+(15-5)== 11,所以即使最小的差异在7和8之间也是如此。我们确实需要知道如何优先考虑解决方案并解决冲突/重复问题,正如gbn所提到的那样。 – 2011-05-19 18:50:02

回答

3

假设

其中给出从表-A 1行中,我们发现从表-B的1行这是最接近

select 
    * 
from 
    TABLE_A a 
    cross apply 
    (select top 1 Number from TABLE_B b order by abs(b.Number - a.Number)) b2 

这也假设在B行可以重复:试试吧并看看它是否做到了你想要的。但是,这应该适合您的示例数据,以便它能够回答您的问题...

1
select v.* 
from 

    (select a.value as avalue, b.value as bvalue, 
    (abs(a.value - b.value)) as difference 
    from 
    TABLE_A a, 
    TABLE_B b) v, 

    (select a.value as avalue, b.value as bvalue, 
    min((abs(a.value - b.value))) as difference 
    from 
    TABLE_A a, 
    TABLE_B b 
    group by a.value, b.value) m 

where m.avalue = v.avalue and m.bvalue = v.value and m.difference = v.difference 
0

您可能需要使用游标来处理这个问题。将每个表中的数据复制到他们自己的临时表中,并将您的逻辑一次一行地应用。

如果没有游标,甚至不可能发生这种情况的原因是,处理第一个表中每个数字的顺序将影响最终结果。

如果你的第一个表看起来像这样

9 
10 

而且你的第二个表看起来像这样

5 
6 

然后你的结果会是这样的,如果你处理9第一

9,6 
10,5 

如果你先处理了10个,结果看起来像这样

10,6 
9,5