假设这是表格和内容:
name phone
Adam 123
Tony 234
John
Pawl
Spenser 123
Bill 345
预期结果是:
name phone
Adam 123
Tony 234
John
Pawl
Bill 345
斯宾塞 - 已删除(重复的手机( John & Pawl - 未删除(空不被视为重复(
如果您使用的是不支持 CTE 的 SQL 版本,则可以使用UNION
查询生成所需的结果。UNION
的第一部分得到一个唯一的(MIN
(值,用于每个phone
的name
值,这是不NULL
的;第二个返回phone
NULL
的所有name
值:
SELECT MIN(name) AS name, phone
FROM phones
WHERE phone IS NOT NULL
GROUP BY phone
UNION
SELECT name, phone
FROM phones
WHERE phone IS NULL
输出
name phone
Adam 123
Tony 234
Bill 345
John null
Pawl null
在 dbfiddle 上演示
假设您只想保留按字母顺序排列的"最早"名称,如果两个或多个名称恰好具有相同的电话号码,我们可以在此处使用ROW_NUMBER
:
WITH cte AS (
SELCET name, phone, ROW_NUMBER() OVER (PARTITION BY phone ORDER BY name) rn
FROM yourTable
)
SELECT name, phone
FROM cte
WHERE rn = 1 OR phone IS NULL;
上述WHERE
子句中phone
字段的空检查使缺少电话号码的所有记录不必是最早的。
您可以使用此查询
WITH cte AS (
SELECT name, phone, ROW_NUMBER() OVER (PARTITION BY phone ORDER BY name) rn
FROM testtable
)
SELECT
name,
IIF(rn=1,phone,NULL)
FROM cte