Kullanabileceğiniz 4 yöntem vardır:
- DISTINCT
- GRUPLAMA
- Alt sorgu
- ROW_NUMBER () ile Ortak Tablo İfadesi (CTE)
TABLETest verileriyle birlikte aşağıdaki örneği düşünün :
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);
Seçenek 1: DISTINCT SEÇİN
Bu en basit ve anlaşılır, ancak aynı zamanda en sınırlı yoldur:
SELECT DISTINCT word, num
FROM dupes
ORDER BY word, num;
2. Seçenek: GRUPLAMA
Gruplama, gibi, toplanan verileri eklemenize olanak verir min(id), max(id), count(*)vb:
SELECT word, num, min(id), max(id), count(*)
FROM dupes
GROUP BY word, num
ORDER BY word, num;
3. Seçenek: Alt sorgu
Bir alt sorgu kullanarak, önce yok sayılacak yinelenen satırları belirleyebilir ve ardından bunları WHERE NOT IN (subquery)yapıyla dış sorguda filtreleyebilirsiniz :
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. Seçenek: ROW_NUMBER () ile Ortak Tablo İfadesi
Ortak Tablo İfadesinde (CTE), grup sütununa göre bölümlenmiş ve istenen sırada sıralanan ROW_NUMBER () öğesini seçin. Ardından yalnızca aşağıdakilere sahip kayıtları SEÇİN 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;