选择差异最小的行

时间:2011-05-19 18:26:37

标签: sql

我对SQL非常强大,但我想不出这个“外观相似”的数据分析问题的好方法:

给定一个带有一组整数的表,我需要将每个整数与最相似的第二个表中的整数相匹配(最小绝对差)。通常我会根据数字的差异进行笛卡尔连接和排序,但是我只需要为每个表中的每一行进行一次配对,因此两个表中的值都不能使用两次。

知道怎么做到这一点吗?

编辑:示例:

TABLE_A

34
57
108
219
380
5000

表-B

4000
200
400
99
40
33
34
4600

配对将是table_a中的一行和table_b中最接近的行:

RESULT

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

因此,两个表中的行都不会出现两次。

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

3 个答案:

答案 0 :(得分:3)

假设

  

从table_a给出1行,我们从table_b找到最接近的一行

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 :(得分: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

答案 2 :(得分:0)

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

如果不是没有光标,即使不是不可能,这也很困难,因为从第一个表中处理每个数字的顺序将影响最终结果。

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

9
10

你的第二张桌子就像这样

5
6

如果您处理第9个

,那么您的结果将如下所示
9,6
10,5

如果您处理了第一个

,结果将如下所示
10,6
9,5