PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Eins-zu-eins eindeutige Einschränkung der Auswahl

Versuchen Sie:

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

Geige:http://sqlfiddle.com/#!15/ab5ae/5/0

Obwohl es nicht mit Ihrer erwarteten Ausgabe übereinstimmt, denke ich, dass die Ausgabe basierend auf Ihrer Beschreibung korrekt ist, da Sie sehen können, dass jedes Paar einen Unterschied mit einem absoluten Wert von 1 aufweist.

Bearbeiten - Versuchen Sie Folgendes, basierend auf der Reihenfolge von a bis 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

Geige:http://sqlfiddle.com/#!15/ab5ae/19/0