2014-01-15 2 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

당신이 경우 여러 행을 반환하려면 동점이라면 ROW_NUMBER() 대신 RANK()을 사용하고 싶을 것입니다.

관련 문제