题目描述

(通过次数22,327 | 提交次数47,765,通过率46.74%)

MyNumbers 表:
+-------------+------+
| Column Name | Type |
+-------------+------+
| num         | int  |
+-------------+------+
这张表没有主键。可能包含重复数字。
这张表的每一行都含有一个整数。

单一数字 是在 MyNumbers 表中只出现一次的数字。
请你编写一个 SQL 查询来报告最大的 单一数字 。如果不存在 单一数字 ,查询需报告 null 。

查询结果如下例所示。
示例 1:
输入:
MyNumbers 表:
+-----+
| num |
+-----+
| 8   |
| 8   |
| 3   |
| 3   |
| 1   |
| 4   |
| 5   |
| 6   |
+-----+
输出:
+-----+
| num |
+-----+
| 6   |
+-----+
解释:单一数字有 1、4、5 和 6 。
6 是最大的单一数字,返回 6 。
示例 2:
输入:
MyNumbers table:
+-----+
| num |
+-----+
| 8   |
| 8   |
| 7   |
| 7   |
| 3   |
| 3   |
| 3   |
+-----+
输出:
+------+
| num  |
+------+
| null |
+------+
解释:输入的表中不存在单一数字,所以返回 null 。

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/biggest-single-number
//测试数据
Create table If Not Exists MyNumbers (num int);

insert into MyNumbers (num) values ('8');
insert into MyNumbers (num) values ('8');
insert into MyNumbers (num) values ('3');
insert into MyNumbers (num) values ('3');
insert into MyNumbers (num) values ('1');
insert into MyNumbers (num) values ('4');
insert into MyNumbers (num) values ('5');
insert into MyNumbers (num) values ('6');

解题思路

MyNumbers表保存了所有的数字。

题目要求:返回最大的单一数字。

单一数字,也就是说只出现了一次的数字。

那么,我们可以先从表中计算出每个数字出现的次数,然后过滤出只出现一次的数字。

最后,取出单一数字的最大值即可。

这里涉及到SQL中SELECT各子句的执行顺序,因为HAVING子句在GROUP BY子句之后执行,因此可以在同一句SQL中完成汇总统计数字出现的次数并筛选出只出现一次的数字。

而MAX操作在HAVING子句之前执行,所以无法实现HAVING子句筛选数据后再取出最大值。一般的处理方法是,在外层包一层子查询,实现MAX操作。

参考SQL

未特别说明的情况下,参考SQL为基于MySQL8.0实现。
select
    max(num) num
from (
    select
        num
    from MyNumbers
    group by num
    having count(1) = 1
)a;
picture loss