Essayez :
select a.id, a.x as ax, b.x as bx, x.min_abs_diff
from table_a a
join table_b b
on a.id = b.id
join (select a.id, min(abs(a.x - b.x)) as min_abs_diff
from table_a a
join table_b b
on a.id = b.id
group by a.id) x
on x.id = a.id
and abs(a.x - b.x) = x.min_abs_diff
violon :http://sqlfiddle.com/#!15/ab5ae/5/0
Bien que cela ne corresponde pas à la sortie attendue, je pense que la sortie est correcte sur la base de ce que vous avez décrit, car vous pouvez voir que chaque paire a une différence avec une valeur absolue de 1.
Modifier - Essayez ce qui suit, en vous basant sur l'ordre de a à b :
select *
from (select a.id,
a.x as ax,
b.x as bx,
x.min_abs_diff,
row_number() over(partition by a.id, b.x order by a.id, a.x) as rn
from table_a a
join table_b b
on a.id = b.id
join (select a.id, min(abs(a.x - b.x)) as min_abs_diff
from table_a a
join table_b b
on a.id = b.id
group by a.id) x
on x.id = a.id
and abs(a.x - b.x) = x.min_abs_diff) x
where x.rn = 1
Violon :http://sqlfiddle.com/#!15/ab5ae/19/0