sql >> データベース >  >> RDS >> PostgreSQL

選択に関する1対1の明確な制限

    試してみてください:

    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
    

    フィドル: http://sqlfiddle.com/#!15/ab5ae/5/0

    期待される出力とは一致しませんが、各ペアには絶対値1の違いがあることがわかるので、説明した内容に基づいて出力は正しいと思います。

    編集-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
    

    フィドル: http://sqlfiddle.com/#!15/ab5ae/19/0



    1. 配列インデックスにPostgresqlJSONB配列をどのように作成しますか?

    2. postgres:現在の最大値を含むすべての整数列を検索します

    3. PHPで2つの緯度と経度の間の運転距離を計算する方法

    4. Postgresのタイムスタンプフィールドで日付をグループ化するにはどうすればよいですか?