Prøv:
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
violin:http://sqlfiddle.com/#!15/ab5ae/5/0
Selvom det ikke stemmer overens med dit forventede output, tror jeg, at outputtet er korrekt baseret på det, du beskrev, da du kan se, at hvert par har en forskel med en absolut værdi på 1.
Rediger - Prøv følgende, baseret på rækkefølgen fra a til 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
Violin:http://sqlfiddle.com/#!15/ab5ae/19/0