Có 4 phương pháp bạn có thể sử dụng:
- DISTINCT
- NHÓM THEO
- Truy vấn con
- Biểu thức bảng chung (CTE) với ROW_NUMBER ()
Hãy xem xét mẫu sau TABLEvới dữ liệu thử nghiệm:
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);   
Tùy chọn 1: CHỌN DISTINCT
Đây là cách đơn giản và dễ hiểu nhất, nhưng cũng là cách hạn chế nhất:
SELECT DISTINCT word, num 
FROM    dupes
ORDER BY word, num;
Tùy chọn 2: NHÓM THEO
Nhóm cho phép bạn thêm dữ liệu tổng hợp, giống như min(id), max(id), count(*), vv:
SELECT  word, num, min(id), max(id), count(*)
FROM    dupes
GROUP BY word, num
ORDER BY word, num;
Tùy chọn 3: Truy vấn con
Sử dụng truy vấn con, trước tiên bạn có thể xác định các hàng trùng lặp để bỏ qua, sau đó lọc chúng ra trong truy vấn bên ngoài với WHERE NOT IN (subquery)cấu trúc:
    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;
Tùy chọn 4: Biểu thức bảng chung với ROW_NUMBER ()
Trong Biểu thức Bảng Chung (CTE), chọn ROW_NUMBER (), được phân vùng theo cột nhóm và sắp xếp theo thứ tự mong muốn. Sau đó CHỌN chỉ các bản ghi có 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;