다음과 같은 4 가지 방법을 사용할 수 있습니다.
- 뚜렷한
- 그룹화
- 하위 쿼리
- ROW_NUMBER ()를 사용하는 CTE (공통 테이블 식)
TABLE
테스트 데이터가 있는 다음 샘플 을 고려하십시오 .
CREATE TEMPORARY TABLE dupes(word text, num int, id int);
INSERT INTO dupes(word, num, id)
VALUES ('aaa', 100, 1)
,('bbb', 200, 2)
,('ccc', 300, 3)
,('bbb', 400, 4)
,('bbb', 200, 5)
,('ccc', 300, 6)
,('ddd', 400, 7)
,('bbb', 400, 8)
,('aaa', 100, 9)
,('ccc', 300, 10);
옵션 1 : DISTINCT 선택
이것은 가장 간단하고 간단하지만 가장 제한적인 방법이기도합니다.
SELECT DISTINCT word, num
FROM dupes
ORDER BY word, num;
옵션 2 : GROUP BY
그룹화 당신이 같이 집계 데이터를 추가 할 수 있습니다 min(id)
, max(id)
, count(*)
, 등 :
SELECT word, num, min(id), max(id), count(*)
FROM dupes
GROUP BY word, num
ORDER BY word, num;
옵션 3 : 하위 쿼리
하위 쿼리를 사용하여 먼저 무시할 중복 행을 식별 한 다음 WHERE NOT IN (subquery)
구문 을 사용하여 외부 쿼리에서 필터링 할 수 있습니다 .
SELECT distinct d2.id
FROM dupes d1
INNER JOIN dupes d2 ON d2.word=d1.word AND d2.num=d1.num
WHERE d2.id > d1.id
SELECT *
FROM dupes
WHERE id NOT IN (
SELECT d2.id
FROM dupes d1
INNER JOIN dupes d2 ON d2.word=d1.word AND d2.num=d1.num
WHERE d2.id > d1.id
)
ORDER BY word, num;
옵션 4 : ROW_NUMBER ()를 사용하는 공통 테이블 표현식
CTE (Common Table Expression)에서 그룹 열로 분할되고 원하는 순서로 정렬 된 ROW_NUMBER ()를 선택합니다. 그런 다음 다음이있는 레코드 만 선택합니다 ROW_NUMBER() = 1
.
WITH CTE AS (
SELECT *
,row_number() OVER(PARTITION BY word, num ORDER BY id) AS row_num
FROM dupes
)
SELECT word, num, id
FROM cte
WHERE row_num = 1
ORDER BY word, num;