题目描述
(通过次数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;
本站所有内容均为原创,本站保留所有权利。仅允许非商业用途的转载,但必须注明来源网站、作者、来源链接!否则,由此造成的一切后果,由转载方承担!
干货分享、技术提升、面试笔试、学习交流,欢迎关注公众号:xuesql。QQ学习交流群:209942678。