それphone
があなたの疑似主キーだと思います。意味: クエリを使用して一意になる必要があります。
Postgres の場合、次のように動作します。
SELECT DISTINCT ON (phone)
*
FROM your_table
電話番号ごとに任意の行を選択するため、電話番号が区別されます。
たぶんアクセスに相当するものがありDISTINCT ON (...)
ますか?
テーブルにREAL UNIQUEid
識別子がある場合、これは機能します。
SELECT *
FROM your_table
WHERE id IN (
SELECT min(id)
FROM your_table
GROUP BY phone
)
完璧ではないかもしれませんが (最速のクエリ)、うまくいきました。
SELECT *
FROM (
SELECT ROW_NUMBER() OVER () AS pseudoid, *
FROM your_table
) x
JOIN (
SELECT MIN(pseudoid) AS pseudoid
FROM (
SELECT ROW_NUMBER() OVER () AS pseudoid, phone
FROM your_table
) z
GROUP BY z.phone
) y
ON x.pseudoid = y.pseudoid
説明:
最初 (9 ~ 10 行目):
SELECT ROW_NUMBER() OVER () AS pseudoid, phone
FROM your_table
これにより、すべての行の pseudo_id (および電話番号) が得られます。したがって、重複するエントリがありますが、すべてのエントリには一意の疑似 ID があります。次に (7 行目から 12 行目):
SELECT MIN(pseudoid) AS pseudoid
FROM (
SELECT ROW_NUMBER() OVER () AS pseudoid, phone
FROM your_table
) z
GROUP BY z.phone
これにより、電話番号が一意になり、常に MIN (疑似) が選択されます。次に (3 ~ 4 行目):
SELECT ROW_NUMBER() OVER () AS pseudoid, *
FROM your_table
WHOLE テーブルの疑似 ID を作成します。
次に、これらのテーブルを結合します。これにより、電話番号ごとに、最小の疑似 ID を持つ完全な行 (+ 疑似 ID) が得られます。
少し小さい(そしておそらく速い):
WITH pseudo_id_table AS (SELECT ROW_NUMBER() OVER () AS pseudoid, * FROM your_table)
SELECT *
FROM pseudo_id_table x
JOIN (
SELECT MIN(pseudoid) AS pseudoid
FROM pseudo_id_table
GROUP BY phone
) y
ON x.pseudoid = y.pseudoid