问题
I want to find all unique records in the Dat1 field, but I want every single Null record returned. It doesn't matter which duplicate record is dropped.
Example Table:
+----+--------------+
| ID | Dat1 |
+----+--------------+
| 1 | 11@email.com |
| 2 | 11@email.com |
| 3 | NULL |
| 4 | NULL |
| 5 | 99@email.com |
| 6 | 99@email.com |
+----+--------------+
Desired Result:
+----+--------------+
| ID | Dat1 |
+----+--------------+
| 1 | 11@email.com |
| 3 | NULL |
| 4 | NULL |
| 5 | 99@email.com |
+----+--------------+
Is this possible? I tried a couple of approaches with sub-queries but couldn't quite pull it off.
回答1:
select min(id), dat1 from table where dat1 is not null group by dat1
union
select id , dat from table where dat1 is null
回答2:
You can use ROW_NUMBER to eliminate duplicate for non-null Dat1s and then use UNION ALL to add the NULL values:
WITH tbl(Id, Dat1) AS(
SELECT 1, '11@email.com' UNION ALL
SELECT 2, '11@email.com' UNION ALL
SELECT 3, NULL UNION ALL
SELECT 4, NULL UNION ALL
SELECT 5, '99@email.com' UNION ALL
SELECT 6, '99@email.com'
)
SELECT
Id, Dat1
FROM (
SELECT *,
rn = ROW_NUMBER() OVER(PARTITION BY Dat1 ORDER BY Id)
FROM tbl
WHERE Dat1 IS NOT NULL
)t
WHERE rn = 1
UNION ALL
SELECT * FROM tbl WHERE Dat1 IS NULL
来源:https://stackoverflow.com/questions/36781976/find-non-duplicate-records-excluding-nulls-based-on-one-field