2点間の線を記述したPostgreSQLテーブルがあります。これには、ポイントのIDを表す整数AとBの2つの列が含まれています(別の表で説明されています)。
ただし、AからBに向かう線は、BからAに向かう線と同じであるため、各行はテーブル内で複製されます。
重複を削除したいのですが、AB行とBA行を再グループ化してから1つを削除するために、2つの列で機能する集計関数が見つかりません。
ありがとう :)
2点間の線を記述したPostgreSQLテーブルがあります。これには、ポイントのIDを表す整数AとBの2つの列が含まれています(別の表で説明されています)。
ただし、AからBに向かう線は、BからAに向かう線と同じであるため、各行はテーブル内で複製されます。
重複を削除したいのですが、AB行とBA行を再グループ化してから1つを削除するために、2つの列で機能する集計関数が見つかりません。
ありがとう :)
重複の特定:
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);
(未検証!)
コメントを残しましたが、ここでは、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
)