Example 1
Delete duplicate email rows and keep the earliest id
Each email group is partitioned together and ordered by id, so the earliest row gets rn = 1. Rows with rn > 1 are treated as duplicates and deleted. That keeps Ada One, Bob One, and Cara One while removing the later duplicates.
CREATE TABLE contacts (id INT, email VARCHAR(100), name VARCHAR(50));
INSERT INTO
contacts (id, email, name)
VALUES
(1, '[email protected]', 'Ada One'),
(2, '[email protected]', 'Bob One'),
(3, '[email protected]', 'Ada Two'),
(4, '[email protected]', 'Cara One'),
(5, '[email protected]', 'Bob Two');DELETE FROM contacts
WHERE
id IN (
SELECT
id
FROM
(
SELECT
id,
ROW_NUMBER() OVER (
PARTITION BY
email
ORDER BY
id
) AS rn
FROM
contacts
) ranked
WHERE
rn > 1
);
SELECT
id,
email,
name
FROM
contacts
ORDER BY
id;| id | name | |
|---|---|---|
| 1 | [email protected] | Ada One |
| 2 | [email protected] | Bob One |
| 4 | [email protected] | Cara One |
CREATE TABLE contacts (id INT, email VARCHAR(100), name VARCHAR(50));
INSERT INTO
contacts (id, email, name)
VALUES
(1, '[email protected]', 'Ada One'),
(2, '[email protected]', 'Bob One'),
(3, '[email protected]', 'Ada Two'),
(4, '[email protected]', 'Cara One'),
(5, '[email protected]', 'Bob Two');WITH
ranked AS (
SELECT
id,
ROW_NUMBER() OVER (
PARTITION BY
email
ORDER BY
id
) AS rn
FROM
contacts
)
DELETE FROM ranked
WHERE
rn > 1;
SELECT
id,
email,
name
FROM
contacts
ORDER BY
id;| id | name | |
|---|---|---|
| 1 | [email protected] | Ada One |
| 2 | [email protected] | Bob One |
| 4 | [email protected] | Cara One |
CREATE TABLE contacts (id INT, email VARCHAR(100), name VARCHAR(50));
INSERT INTO
contacts (id, email, name)
VALUES
(1, '[email protected]', 'Ada One'),
(2, '[email protected]', 'Bob One'),
(3, '[email protected]', 'Ada Two'),
(4, '[email protected]', 'Cara One'),
(5, '[email protected]', 'Bob Two');WITH
ranked AS (
SELECT
id,
ROW_NUMBER() OVER (
PARTITION BY
email
ORDER BY
id
) AS rn
FROM
contacts
)
DELETE FROM contacts USING ranked
WHERE
contacts.id = ranked.id
AND ranked.rn > 1;
SELECT
id,
email,
name
FROM
contacts
ORDER BY
id;| id | name | |
|---|---|---|
| 1 | [email protected] | Ada One |
| 2 | [email protected] | Bob One |
| 4 | [email protected] | Cara One |
The deduplication logic is the same across engines, but the delete statement shape differs enough to keep the SQL split out.