2011-05-19 111 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