SQL - 选择每个重复列的第一个,但在列中保留具有空值的记录



假设这是表格和内容:

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(值,用于每个phonename值,这是不NULL的;第二个返回phoneNULL的所有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

相关内容

  • 没有找到相关文章

最新更新