196. 删除重复的电子邮箱
表: Person
±------------±--------+
| Column Name | Type |
±------------±--------+
| id | int |
| email | varchar |
±------------±--------+
id 是该表的主键列(具有唯一值的列)。
该表的每一行包含一封电子邮件。电子邮件将不包含大写字母。
编写解决方案 删除 所有重复的电子邮件,只保留一个具有最小 id 的唯一电子邮件。
(对于 SQL 用户,请注意你应该编写一个 DELETE 语句而不是 SELECT 语句。)
(对于 Pandas 用户,请注意你应该直接修改 Person 表。)
运行脚本后,显示的答案是 Person 表。驱动程序将首先编译并运行您的代码片段,然后再显示 Person 表。Person 表的最终顺序 无关紧要 。
返回结果格式如下示例所示。
示例 1:
输入:
Person 表:
±—±-----------------+
| id | email |
±—±-----------------+
| 1 | john@example.com |
| 2 | bob@example.com |
| 3 | john@example.com |
±—±-----------------+
输出:
±—±-----------------+
| id | email |
±—±-----------------+
| 1 | john@example.com |
| 2 | bob@example.com |
±—±-----------------+
解释: john@example.com重复两次。我们保留最小的Id = 1。
题解
删除不推荐,看到delete就得三思一下,你又不是删库跑路,哈哈
删除重复的,就是去重,怎么去重?
group by 取min 删除其他?
row_number 排名保留1个删除其他?
子查询把要删除的查出来?
方法一 row_number去重留最小
-- 删除不推荐,看到delete就得三思一下
delete from Person where id not in (select id from (select min(id) as id from person group by email ) tmp
)-- 还是优先查出来要保留的内容吧
select
tmp.id,tmp.email
from (select id,email,row_number() over(partition by email order by id) as rn from Person
) tmp where tmp.rn=1 order by id
其他方法不再扩展,自己搞搞就行,都比较简单,结构也差不太多