sql >> Base de Datos >  >> RDS >> PostgreSQL

restricción distinta uno a uno en la selección

Prueba:

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

violín:http://sqlfiddle.com/#!15/ab5ae/5/0

Aunque no coincide con el resultado esperado, creo que el resultado es correcto según lo que describiste, como puedes ver, cada par tiene una diferencia con un valor absoluto de 1.

Editar:intente lo siguiente, según el orden de a 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

Violín:http://sqlfiddle.com/#!15/ab5ae/19/0