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 TABLE
vớ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;