Istnieją 4 metody, których możesz użyć:
- ODRĘBNY
- GRUPUJ WEDŁUG
- Podzapytanie
- Wspólne wyrażenie tabelowe (CTE) z ROW_NUMBER ()
Rozważ następujący przykład TABLE
z danymi testowymi:
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);
Opcja 1: SELECT DISTINCT
Jest to najprostszy i najprostszy, ale także najbardziej ograniczony sposób:
SELECT DISTINCT word, num
FROM dupes
ORDER BY word, num;
Opcja 2: GROUP BY
Grupowanie pozwala na dodawanie zagregowane dane, podobnie jak min(id)
, max(id)
, count(*)
itp:
SELECT word, num, min(id), max(id), count(*)
FROM dupes
GROUP BY word, num
ORDER BY word, num;
Opcja 3: podzapytanie
Korzystając z podzapytania, możesz najpierw zidentyfikować zduplikowane wiersze do zignorowania, a następnie odfiltrować je w zewnętrznym zapytaniu za pomocą WHERE NOT IN (subquery)
konstrukcji:
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;
Opcja 4: wspólne wyrażenie tabeli z ROW_NUMBER ()
W Common Table Expression (CTE) wybierz ROW_NUMBER (), podzielony na partycje według kolumny grupy i uporządkowany w żądanej kolejności. Następnie WYBIERZ tylko te rekordy, które mają 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;