developer tip

PostgreSQL로 중복 행 찾기

copycodes 2020. 11. 14. 10:45
반응형

PostgreSQL로 중복 행 찾기


다음 열이있는 사진 테이블이 있습니다.

id, merchant_id, url 

이 테이블에는 조합에 대한 중복 값이 ​​포함되어 있습니다 merchant_id, url. 따라서 하나의 행이 여러 번 나타날 수 있습니다.

234 some_merchant  http://www.some-image-url.com/abscde1213
235 some_merchant  http://www.some-image-url.com/abscde1213
236 some_merchant  http://www.some-image-url.com/abscde1213

이러한 중복을 삭제하는 가장 좋은 방법은 무엇입니까? (PostgreSQL 9.2 및 Rails 3을 사용합니다.)


여기에 내 의견이 있습니다.

select * from (
  SELECT id,
  ROW_NUMBER() OVER(PARTITION BY merchant_Id, url ORDER BY id asc) AS Row
  FROM Photos
) dups
where 
dups.Row > 1

삭제하려는 레코드를 사양에 맞게 조정하여 주문을 자유롭게 재생하십시오.

SQL Fiddle => http://sqlfiddle.com/#!15/d6941/1/0


Postgres 9.2 용 SQL Fiddle은 더 이상 지원되지 않습니다. SQL Fiddle을 postgres 9.3으로 업데이트


sgeddes의 답변의 두 번째 부분은 Postgres에서 작동하지 않습니다 (피들은 MySQL을 사용합니다). 다음은 Postgres를 사용하여 업데이트 된 버전입니다. http://sqlfiddle.com/#!12/6b1a7/1

DELETE FROM Photos AS P1  
USING Photos AS P2
WHERE P1.id > P2.id
   AND P1.merchant_id = P2.merchant_id  
   AND P1.url = P2.url;  

몇 가지 옵션이 있습니다.

빠른 방법으로 다음과 같이 사용하십시오 (위에서 234를 여러 번 언급 했으므로 ID 열이 고유하지 않다고 가정).

CREATE TABLE tmpPhotos AS SELECT DISTINCT * FROM Photos;
DROP TABLE Photos;
ALTER TABLE tmpPhotos RENAME TO Photos;

다음은 SQL Fiddle 입니다.

제약 조건이있는 경우 테이블에 다시 제약 조건을 추가해야합니다.

ID 열이 고유 한 경우 가장 낮은 ID를 유지하는 것과 같은 작업을 수행 할 수 있습니다.

DELETE FROM P1  
USING Photos P1, Photos P2
WHERE P1.id > P2.id
   AND P1.merchant_id = P2.merchant_id  
   AND P1.url = P2.url;  

그리고 바이올린 .

참고 URL : https://stackoverflow.com/questions/14471179/find-duplicate-rows-with-postgresql

반응형