2014-01-15 73 views
0

假設我有價值觀和類別的表:如何比較每一行並獲得最佳結果?

+--+-----+---+ 
|ID|value|cat| 
+--+-----+---+ 
|0 |1 |0 | 
+--+-----+---+ 
|1 |3 |0 | 
+--+-----+---+ 
|2 |2 |1 | 
+--+-----+---+ 
|3 |1.2 |1 | 
+--+-----+---+ 
|4 |1 |1 | 
+--+-----+---+ 

而且我想知道,對於每一行,其值最密切匹配的行的ID屬於同一類別,我也想知道其中的差異。

因此,對於第ID=0行,正確的答案是ID=1,差異值將是2。正確的輸出應該是這樣:

+--+----------+----------+ 
|ID|difference|best match| 
+--+----------+----------+ 
|0 |2   |1   | 
+--+----------+----------+ 
|1 |2   |0   | 
+--+----------+----------+ 
|2 |0.8  |3   | 
+--+----------+----------+ 
|3 |0.2  |4   | 
+--+----------+----------+ 
|4 |0.2  |3   | 
+--+----------+----------+ 

我只是學習CROSS JOIN而我敢肯定,這是可以做到我真的不知道從哪裏開始。

+1

我不明白這個問題如何更清晰。如果你不喜歡它,請提供一個關於如何澄清我想要做的事情的建議。 – arman

回答

2

你可以做到這一點自聯接和利用結合的ROW_NUMBER()功能與MIN()

;WITH cte AS (SELECT a.ID aID 
        ,MIN(ABS(a.value - b.value)) diff 
        ,ROW_NUMBER() OVER(PARTITION BY a.ID ORDER BY MIN(ABS(a.value - b.value)))RN 
        ,b.ID bID 
       FROM Table1 a 
       JOIN Table1 b 
       ON a.cat = b.cat 
       AND a.ID <> b.ID 
       GROUP BY a.ID,b.ID) 
SELECT aID 
     ,diff 
     ,bID Best_Match 
FROM cte 
WHERE RN = 1 

演示:SQL Fiddle

如果你想在的情況下返回多行領帶,你想要使用RANK()而不是ROW_NUMBER()

相關問題