2014-02-15 2 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), предполагая, отрицательные числа являются возможность, хотя я m точно не знаю, как ссылка на курсор 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()). Проблема заключается в том, чтобы выяснить, является ли ближайшее значение больше или меньше значения. Логика здесь показывает ее с помощью условной агрегации и сравнения этих результатов с фактическим минимумом.

Смежные вопросы