只出现一次的最大数字:没有时返回 NULL
LeetCode 619 · HAVING、聚合函数遇到空集
面试怎么回答
子查询里用 HAVING COUNT(*) = 1 找出只出现一次的数字,外层套 MAX。聚合函数对空集返回 NULL,所以没有符合条件的数字时自然输出 NULL;如果用 ORDER BY + LIMIT 就得到空集,不符合要求。
先把这段讲顺;面试官追问时,再展开下面的原理和细节。
详细讲解
题意
数字表里有很多重复数字。在只出现过一次的数字里找最大的那个;如果没有只出现一次的数字,返回 NULL。
表结构
- my_numbers:num(可能重复)
思路
先 GROUP BY num + HAVING COUNT(*) = 1 找出只出现一次的数字,再在外层取 MAX。一个巧妙的点:外层 MAX 作用在空集上时会返回一行 NULL,正好满足「没有就返回 NULL」的要求,不需要额外处理。
参考解法
SELECT
MAX(num) AS num
FROM
(SELECT
num
FROM
my_numbers
GROUP BY num
HAVING COUNT(num) = 1) t1
易错点
- 写成
ORDER BY num DESC LIMIT 1在没有结果时返回空集,而不是 NULL。