3

2点間の線を記述したPostgreSQLテーブルがあります。これには、ポイントのIDを表す整数AとBの2つの列が含まれています(別の表で説明されています)。

ただし、AからBに向かう線は、BからAに向かう線と同じであるため、各行はテーブル内で複製されます。

重複を削除したいのですが、AB行とBA行を再グループ化してから1つを削除するために、2つの列で機能する集計関数が見つかりません。

ありがとう :)

4

2 に答える 2

7

重複の特定:

select least(a,b), greatest(a,b), count(*)
from the_table
group by least(a,b), greatest(a,b)
having count(*) > 1

次を使用して、ペアの1つを削除できるはずです。

delete from the_table
where (least(a,b), greatest(a,b)) in (
                select least(a,b), greatest(a,b)
                from the_table
                group by least(a,b), greatest(a,b)
                having count(*) > 1);

(未検証!)

于 2012-06-12T12:55:44.007 に答える
2

コメントを残しましたが、ここでは、2つの重複するレコードの唯一の違いは、point_id値が同じであるが、順序が逆であるということです。

その場合、実際に行うのは非常に簡単です...

DELETE
  line
WHERE
  point_id_a > point_id_b
  AND EXISTS (SELECT *
                FROM line AS lookup
               WHERE lookup.point_id_a = line.point_id_b
                 AND lookup.point_id_b = line.point_id_a
             )
于 2012-06-12T13:00:41.853 に答える