182. 查找重复的电子邮箱
182. 查找重复的电子邮箱
题目
Table: Person
+-------------+---------+ | Column Name | Type | +-------------+---------+ | id | int | | email | varchar | +-------------+---------+
id is the primary key (column with unique values) for this table.
Each row of this table contains an email. The emails will not contain uppercase letters.
Write a solution to report all the duplicate emails. Note that it's guaranteed that the email field is not NULL.
Return the result table in any order.
The result format is in the following example.
Example 1:
Input:
Person table:
+----+---------+ | id | email | +----+---------+ | 1 | a@b.com | | 2 | c@d.com | | 3 | a@b.com | +----+---------+
Output:
+---------+ | Email | +---------+ | a@b.com | +---------+
Explanation: a@b.com is repeated two times.
题目大意
表: Person
+-------------+---------+ | Column Name | Type | +-------------+---------+ | id | int | | email | varchar | +-------------+---------+
id 是该表的主键(具有唯一值的列)。
此表的每一行都包含一封电子邮件。电子邮件不包含大写字母。
编写解决方案来报告所有重复的电子邮件。 请注意,可以保证电子邮件字段不为 NULL。
以 任意顺序 返回结果表。
结果格式如下例。
示例 1:
输入:
Person 表:
+----+---------+ | id | email | +----+---------+ | 1 | a@b.com | | 2 | c@d.com | | 3 | a@b.com | +----+---------+
输出:
+---------+ | Email | +---------+ | a@b.com | +---------+
解释: a@b.com 出现了两次。
解题思路
SELECT email
:查询结果中只需要返回重复的邮箱字段。FROM Person
:从Person
表中读取数据。GROUP BY email
使用GROUP BY
对email
字段进行分组,将具有相同邮箱的记录分为一组。HAVING COUNT(email) > 1
表示只选择那些重复出现的邮箱。- 利用
COUNT(email)
统计每组中的记录数量。 - 使用
HAVING
子句筛选出记录数大于 1 的组。
- 利用
复杂度分析
- 时间复杂度:
O(n)
,其中n
是表中记录的行数。分组和计数操作需要扫描所有行。 - 空间复杂度:
O(k)
,其中k
是分组的数量,存储每个分组的计数结果需要额外空间。
代码
SELECT email
FROM Person
GROUP BY email
HAVING COUNT(email) > 1