Find non-duplicate records, excluding nulls, based on one field.

痴心易碎 提交于 2019-12-12 03:28:35

问题


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

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!