使用できる方法は4つあります。
- DISTINCT
- GROUP BY
- サブクエリ
- ROW_NUMBER()を使用した共通テーブル式(CTE)
TABLEテストデータを含む次のサンプルについて考えてみます。
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);
オプション1:SELECT DISTINCT
これは最も単純で簡単ですが、最も制限された方法でもあります。
SELECT DISTINCT word, num
FROM dupes
ORDER BY word, num;
オプション2:GROUP BY
グループは次のように、あなたが集計されたデータを追加することができますmin(id)、max(id)、count(*)、など:
SELECT word, num, min(id), max(id), count(*)
FROM dupes
GROUP BY word, num
ORDER BY word, num;
オプション3:サブクエリ
サブクエリを使用すると、最初に無視する重複行を特定してから、次のWHERE NOT IN (subquery)構成を使用して外部クエリでそれらを除外できます。
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:ROW_NUMBER()を使用した共通テーブル式
Common Table Expression(CTE)で、ROW_NUMBER()を選択し、グループ列でパーティション化して、目的の順序で並べ替えます。次に、次のレコードのみを選択します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;