Ada 4 metode yang dapat Anda gunakan:
- BERBEDA
- GRUP OLEH
- Subquery
- Ekspresi Tabel Umum (CTE) dengan ROW_NUMBER ()
Pertimbangkan contoh berikut TABLEdengan data uji:
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);
Opsi 1: PILIH DISTINCT
Ini adalah cara yang paling sederhana dan mudah, tetapi juga cara yang paling terbatas:
SELECT DISTINCT word, num
FROM dupes
ORDER BY word, num;
Opsi 2: KELOMPOKKAN OLEH
Pengelompokan memungkinkan Anda untuk menambahkan data dikumpulkan, seperti min(id), max(id), count(*), dll:
SELECT word, num, min(id), max(id), count(*)
FROM dupes
GROUP BY word, num
ORDER BY word, num;
Opsi 3: Subkueri
Dengan menggunakan subkueri, Anda dapat mengidentifikasi baris duplikat untuk diabaikan terlebih dahulu, lalu memfilternya di kueri luar dengan WHERE NOT IN (subquery)konstruksi:
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;
Opsi 4: Ekspresi Tabel Umum dengan ROW_NUMBER ()
Di Common Table Expression (CTE), pilih ROW_NUMBER (), yang dipartisi menurut kolom grup dan diurutkan dalam urutan yang diinginkan. Kemudian PILIH hanya record yang memiliki 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;