目录

  • 一、题目
  • 二、解决
    • 1、关联去除
    • 2、分组删除
    • 3、开窗之row_number()
  • 三、参考

一、题目

表: 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、关联去除

思路: 略。
代码:

DELETE t1
FROM Person t1, Person t2
WHERE t1.Email = t2.Email AND t1.Id > t2.Id;

2、分组删除

思路: 略。

delete from Person
where id not in (select t1.id from (select min(Id) as idfrom Person group by Email) as t1
);

注意:

您好,请问下面这么写为什么不对呢,为什么一定要把min id二次提取呢?

delete from Person
where id not in
(select min(Id) as id from Person  group by Email)
  • 因为mysql不允许同时对一个表delete和select联合操作。

3、开窗之row_number()

思路:

根据题意可知该题希望保留的是同一邮箱下Id较小的那条数据,反之就是需删除同一邮箱下Id较大的数据条目,这里使用开窗函数来解决:

  • 针对同一邮箱,对其Id序号进行排序rnk;
  • 依据题意,只保留排序rnk=1的数据,其余数据均需删除

代码:

delete
from Person
where Id in (select Idfrom (select Id, row_number() over(partition by Email order by Id) rnkfrom Person) t1where rnk > 1
);

三、参考

1、对「官方」题解中 “delete” 和 “>” 的解释,推荐!
2、group by作为临时表关联删除
3、一只猪的解题思路
4、开窗函数解法

【LeetCode-SQL】196. 删除重复的电子邮箱相关推荐

  1. LeetCode SQL 196. 删除重复的电子邮箱

    196. 删除重复的电子邮箱 Ideas 首先Person表与自身在Email列中连接起来,然后需要找到具有相同Email地址的更大ID,这就是我们要删除的记录. Code delete p1 fro ...

  2. 【LeetCode】196. 删除重复的电子邮箱

    2019独角兽企业重金招聘Python工程师标准>>> 编写一个 SQL 查询,来删除 Person 表中所有重复的电子邮箱,重复的邮箱里只保留 Id 最小 的那个. +----+- ...

  3. 【SQL】 196.删除重复的电子邮箱

    196. 删除重复的电子邮箱 编写一个 SQL 删除语句来 删除 所有重复的电子邮件,只保留一个id最小的唯一电子邮件. 以 任意顺序 返回结果表. (注意: 仅需要写删除语句,将自动对剩余结果进行查 ...

  4. 数据库题目 - 196. 删除重复的电子邮箱

    文章目录 1.题目描述 2. 解答 1.题目描述 编写一个 SQL 查询,来删除 Person 表中所有重复的电子邮箱,重复的邮箱里只保留 Id 最小 的那个. ±-±---------------- ...

  5. [196]. 删除重复的电子邮箱

    文章目录 1.题目 2.示例 3. 答案 ①.连接 ②.分组 错误答案 1.题目 表: Person ±------------±--------+ | Column Name | Type | ±- ...

  6. 196. 删除重复的电子邮箱表

    表: Person +-------------+---------+ | Column Name | Type    | +-------------+---------+ | id         ...

  7. 196. 删除重复的电子邮箱

    问题描述: SQL架构 表: Person +-------------+---------+ | Column Name | Type | +-------------+---------+ | i ...

  8. 文巾解题 196. 删除重复的电子邮箱

    1 题目描述 2 解题思路 2.1 双表联立 DELETE p1 FROM Person p1, Person p2 WHERE p1.Email = p2.Email AND p1.Id > ...

  9. 【LeetCode-SQL每日一练】—— 196. 删除重复的电子邮箱

最新文章

  1. 多线程处理缓慢_华为昇腾,AI推理性能超越对手一倍:软件挖掘处理器全部潜力...
  2. Linux Shell ssh登录脚本
  3. ECMAScript 6 模板字面量的常见用法
  4. setTimeout 定时器的使用
  5. 常见数据归一化的几种方法
  6. 蓝牙BLE LINK LAYER剖析(一) -- status and channel
  7. 【机器学习基础】(六):通俗易懂无监督学习K-Means聚类算法及代码实践
  8. python 图像变化检测_python hough变换检测直线的实现方法
  9. 【C#桌面应用】第四节:制作简单的登录注册模拟窗口-登录部分的模拟
  10. C语言仅在函数中可见,如何学习C语言、入门C语言,看这篇就够了
  11. vue的matcher_一张思维导图辅助你深入了解 Vue | Vue-Router | Vuex 源码架构
  12. WinForm的延时加载控件概述
  13. Spring的@Transactional事务注意事项
  14. 能源管理零代码开发工具
  15. ArcGIS初步 系列视频教程
  16. vue3组合式Composition API之ref函数的具体用法
  17. Java 实战:桌球小游戏
  18. 1.初始PR,怎么导入素材和添加效果处理?
  19. 计算机(computer)俗称电脑
  20. linux 搜狗拼音 自动隐藏状态栏

热门文章

  1. 大数据同步利器: 表格存储全增量一体消费通道 1
  2. 一张图分出你是用左脑还是右脑 z
  3. 离散数学第二版计算机系,离散数学 第2版
  4. linux如何打印脚本运行进度,linux-如何在使用systemd引导期间最后运行并打印我的脚本输出?...
  5. c语言编程a4988驱动步进电机,A4988步进电机单片机驱动程序
  6. php搞笑证件,各类搞笑证件生成器,趣味证件制作软件,一次下载免费使用
  7. Bi-LSTM原理及TensorFlow实现序列标注
  8. H5性能测试入门及优化建议
  9. 三次样条曲线 python实现
  10. 5.12日,好多人的ksjsb遇到签名认证啦~ 勉强跑跑吧~