- 学习:知识的初次邂逅
- 复习:知识的温故知新
练习:知识的实践应用
目录
一,原题力扣链接
二,题干
表:
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。
三,建表语句
Create table If Not Exists Person (Id int, Email varchar(255))
Truncate table Person
insert into Person (id, email) values ('1', 'john@example.com')
insert into Person (id, email) values ('2', 'bob@example.com')
insert into Person (id, email) values ('3', 'john@example.com')
四,分析
题解:
表:人类表
字段:id,邮箱
要求,删除重复的邮箱,保留最小的id;
思路
- 最小的id 用min
- 以邮箱分组,求min(id)
- 哪怕邮箱没有重复,那么min(id)也是他自己这一条;
- 如果邮箱又重复,那么min id 也是取的最小的一条;
- 最后 delete from biao where id not in (min id)
- 删除表中id 不在最小id的数据; 这样留下的都是id最小的字段了 且没有重复的值;
以邮箱分组求最小值min id 可以用分组,聚合
也可以用窗口
五,SQL解答
解法一,普通分组,聚合min(id)
delete from Person where id not in (
with t1 as (
select min(id) as id from Person group by Email
)
select t1.id from t1
);
解法二,开窗聚合 min函数 以邮箱分组
-- 解法二 开窗
delete from Person where id not in(
with t1 as (
select id, email,
min(id) over(partition by Email) rn
from Person
)
select rn as id from t1
)
六,验证
七,知识点总结
- min函数用法
- 开窗聚合
- 通过求最小值,达到精准的去重效果;
- delete 删除表语句回顾 delete from 表 where 条件
- delete语句里面可以跟select语句
- 学习:知识的初次邂逅
- 复习:知识的温故知新
练习:知识的实践应用