2014-02-15 40 views
1

假設我開始了與「表一」查找各行同一個表內最接近的值

+-----------+ 
|iD | Value | 
|-----------| 
| 0 | 1 | 
| 1 | 5 | 
| 2 | 6 | 
| 3 | 8 | 
+-----------+ 

然後我想創建一個SQL查詢,將顯示標識,數值,數值數值最接近爲當前值&這些值之間的差異,例如

+-----------+------------+------------+ 
|iD | Value | closestVal | Difference | 
|-----------|------------|------------+ 
| 0 | 1 | 5  | 4  | 
| 1 | 5 | 6  | 1  | 
| 2 | 6 | 5  | 1  | 
| 3 | 8 | 6  | 2  | 
+-----------+------------+------------+ 

從研究,我認爲它可能包括使用沿着ABS東西線(a.value中 - b.Value)假設負數是雖然我可能我不確定如何引用curre nt行和比較行的處理以及每個比較的一個值的輸出而不是值的表格。

我該怎麼做呢? 任何幫助,將不勝感激

回答

2

我認爲解決這個最簡單的方法是用相關子查詢:

select t.*, abs(closestvalue - value) as difference 
from (select t.*, 
      (select t2.value 
       from tablea t2 
       order by abs(t2.value - t.value) asc 
       limit 1 
      ) as closestvalue 
     from tablea t 
    ) t; 

你也可以做到這一點明確的join,但邏輯是有些奇怪:

select a.id, a.value, 
     (case when min(case when a.value > a1.value then a.value - a1.value end) = min(abs(a.value - a1.value)) 
      then a.value - min(abs(a.value - a1.value)) 
      else a.value + min(abs(a.value - a1.value)) 
     end) as closestvalue 
     min(abs(a.value - a1.value)) as difference 
from tablea a join 
    tablea a1 
    on a.id <> a1.id 
group by a.id; 

使用這種方法,通過使用min(abs()),很容易找到差異。然後問題是確定最接近的值是大於還是小於值。這裏的邏輯通過使用條件聚合計算出來並將這些結果與實際最小值進行比較。