大家好,我是空空star,本篇带大家了解一道简单的力扣sql练习题。
文章目录
- 前言
- 一、题目:196. 删除重复的电子邮箱
- 二、解题
- 1.正确示范①
- 提交SQL
- 运行结果
- 2.正确示范②
- 提交SQL
- 运行结果
- 3.正确示范③
- 提交SQL
- 运行结果
- 4.正确示范④
- 提交SQL
- 运行结果
- 5.其他
- 总结
前言
一、题目:196. 删除重复的电子邮箱
表: Person
+-------------+---------+
| Column Name | Type |
+-------------+---------+
| id | int |
| email | varchar |
+-------------+---------+
id是该表的主键列。
该表的每一行包含一封电子邮件。电子邮件将不包含大写字母。
编写一个 SQL 删除语句来 删除 所有重复的电子邮件,只保留一个id最小的唯一电子邮件。
以 任意顺序 返回结果表。 (注意: 仅需要写删除语句,将自动对剩余结果进行查询)
查询结果格式如下所示。
示例 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。
二、解题
1.正确示范①
提交SQL
delete from Person
where id in(
select id from (
select id,email,
row_number() over(partition by email order by id) cols
from Person
) u where cols>1
)
运行结果
2.正确示范②
提交SQL
delete from Person
where id in(
select id from (
select id,email,
rank() over(partition by email order by id) cols
from Person
) u where cols>1
)
运行结果
3.正确示范③
提交SQL
delete from Person
where id in(
select id from (
select id,email,
dense_rank() over(partition by email order by id) cols
from Person
) u where cols>1
)
运行结果
4.正确示范④
提交SQL
delete from Person
where id not in(
select min_id from(
select email,min(id) min_id
from Person
group by email
) a
)
运行结果
5.其他
总结
正确示范①思路:
使用开窗函数row_number(),按邮箱分组id升序,取排名1以上的,然后将这部分数据删除掉;
正确示范②思路:
使用开窗函数rank(),按邮箱分组id升序,取排名1以上的,然后将这部分数据删除掉;
正确示范③思路:
使用开窗函数dense_rank(),按邮箱分组id升序,取排名1以上的,然后将这部分数据删除掉;
正确示范④思路:
使用group by按邮箱分组,再用min(id)把每个邮箱对应的最小id找出来,然后将这部分id以外的数据删除。
知识点:
row_number:顺序排序,比如序号为1、2、3
rank:并列排序,会跳过重复的序号,比如序号为1、1、3
dense_rank:并列排序,不会跳过重复的序号,比如序号为1、1、2
因为该题目中id是主键,唯一的,所以row_number、rank、dense_rank在该题目中均适用。