1. ホーム
  2. データベース
  3. ポストグレスキュー

postgresql 重複データ削除 ケーススタディ

2022-01-10 22:36:08

1. テーブルを作成する

/*
 Navicat Premium Data Transfer

 Source Server : localhost
 Source Server Type : PostgreSQL
 Source Server Version : 110012
 Source Host : localhost:5432
 Source Catalog : postgres
 Source Schema : public

 Target Server Type : PostgreSQL
 Target Server Version : 110012
 File Encoding : 65001

 Date: 30/07/2021 10:10:04
*

-- ----------------------------
-- Table structure for test
-- ----------------------------
DROP TABLE IF EXISTS "public". "test";
CREATE TABLE "public". "test" (
  "id" int4 NOT NULL DEFAULT NULL,
  "name" varchar(255) COLLATE "pg_catalog". "default" DEFAULT NULL,
  "age" int4 DEFAULT NULL
)
;

-- ----------------------------
-- Records of test
-- ----------------------------
INSERT INTO "public". "test" VALUES (1, 'da', 1);
INSERT INTO "public". "test" VALUES (2, 'da', 12);
INSERT INTO "public". "test" VALUES (3, 'dd', 80);
INSERT INTO "public". "test" VALUES (4, 'dd', 80);
INSERT INTO "public". "test" VALUES (5, 'd1', 13);

-- ----------------------------
-- Primary Key structure for table test
-- ----------------------------
ALTER TABLE "public". "test" ADD CONSTRAINT "test_pkey" PRIMARY KEY ("id");



2. 名前による重複の取得

まず、どのようなデータが重複しているのかを見てみましょう。

select name ,count(1) from test group by name having count(1)>1


出力します。

名前カウント

ダ2

dd 2

3. 重複するデータをすべて削除する

注意事項 更新するデータのいくつかの列をサードパーティのテーブルとしてクエリし、更新をフィルタリングします。

delete from test where name in (select t.name from (select name ,count(1) from test group by name having count(1)>1) t)


4. データ列を保持する

ここでは、保持する必要のあるデータを示します。 重複するデータ、IDが最大のものを残す

SELECT
 1. 
FROM
 test 
WHERE
 id NOT IN (
 ( SELECT min( id ) AS id FROM test GROUP BY name ) 
 )


5. データの削除

DELETE 
FROM
 test 
WHERE
 id NOT IN (
 SELECT
  t.id 
 FROM
 ( SELECT max( id ) AS id FROM test GROUP BY name ) t 
 )


この記事postgresql削除重複データケースの詳細については、ここで紹介されている、より関連postgresql削除重複データの内容は、スクリプトの家の前の記事を検索してくださいまたは次の関連記事を閲覧し続けるあなたは将来的に多くのスクリプトホームをサポートすることを願って!.