このセクションでは、PostgreSQL で重複行を削除する方法について説明します。PostgreSQL テーブルで重複行を削除するには、distinct キーワードや Partition by などの複数の方法を使用できます。これらの方法では、テーブルの重複行のみが保持されます。これらの各方法については、例を挙げて説明します。

  • PostgreSQL テーブル内の一意の行のみを保持する
  • PostgreSQLテーブル内の不要な重複行を削除する
  • 重複する ID を持つ行を削除し、重複する ID を持たない行のみを保持します。

描写に使用した表は

examscore:

PostgreSQL で重複行を削除する 1


PostgreSQL で重複行を削除する: 方法 1 (PostgreSQL で重複行または一意の行を選択する)

不要な重複を排除してデータを選択する最も効率的で最速の方法です

select distinct * from ExamScore

出力:

PostgreSQL で重複行を削除する 2

方法2: 不要な重複を削除し、一意の行のみを返す

select distinct * from examscore where studentid in  (
select studentid from (
  select studentid,
  ROW_NUMBER() OVER(PARTITION BY studentid ORDER BY studentid asc) AS Row
  FROM examscore
) as foo
where 
foo.Row = 1);
  • PARTITION BY はグループに分割し、ORDER BY は降順で並べ替えます。
  • ROW_NUMBER() は、各カテゴリのすべての行に整数を割り当てます。
  • 行番号が1より大きい重複行はwhere条件で削除され、PostgreSQLでは一意の行のみを含むテーブルが作成されます。

出力:

PostgreSQL で重複行を削除する 3

方法3: 重複しているIDを削除する

重複する ID を削除するには、つまり重複する ID を持つ行を削除し、重複する ID を持たない行のみを保持します。

SELECT *
FROM examscore
WHERE (studentid) IN (
    SELECT studentid
    FROM examscore
    GROUP BY name, studentid
    HAVING COUNT(*) = 1
);

STUDENTID列では重複するIDを削除し、重複しないIDのみを保持する必要があります。そして、重複しないIDの行を保持する必要があります。これは上記のコードで実現できます。

STUDENTID 101と103は複数回出現するため削除されます。

PostgreSQL で重複行を削除する 4

結果のテーブルには重複しないIDがすべて含まれることになります

出力:

PostgreSQL で重複行を削除する 5