문제

A single number is a number that appeared only once in the MyNumbers table.

Find the largest single number. If there is no single number, report null.

The result format is in the following example.

 

MyNumbers 테이블에서 한번만 나오는 수들 중에 가장 큰 수를 출력하기.

 

테이블 & 예제

[MyNumbers]

+-------------+------+
| Column Name | Type |
+-------------+------+
| num         | int  |
+-------------+------+

 

[Example]

Input: 
MyNumbers table:
+-----+
| num |
+-----+
| 8   |
| 8   |
| 3   |
| 3   |
| 1   |
| 4   |
| 5   |
| 6   |
+-----+
Output: 
+-----+
| num |
+-----+
| 6   |
+-----+

Input: 
MyNumbers table:
+-----+
| num |
+-----+
| 8   |
| 8   |
| 7   |
| 7   |
| 3   |
| 3   |
| 3   |
+-----+
Output: 
+------+
| num  |
+------+
| null |
+------+

 

풀이

우선 한번만 나오는 수를 찾아야한다. 주의할 점은 조건에 맞는 수가 없다면 null을 반환해야한다는 점이다.

이를 위해 Having절에 대해서 조금 알아보았다.

HAVING 절을 사용하여 필터링된 결과에서 최대값을 찾을 때, 필터링 조건을 만족하는 행이 없으면 결과는 NULL이 반환됩니다. 이는 SQL의 표준 동작입니다. - GPT

 

이제 null에 대한 고민없이 조건을 걸 수 있다.

SELECT num
FROM MyNumbers
GROUP BY num
HAVING COUNT(num) = 1

 

그러나 문제가 발생한다. 당연하게 SELECT MAX(num)을 사용하면 될 줄 알았는데 생각한 것 처럼 적용되지 않는다.

그 이유는 다음과 같다.

HAVING 절은 그룹화된 결과 집합에 대한 조건을 지정하는 데 사용됩니다. 
집계 함수 (MAX, MIN, SUM, COUNT 등)를 사용하여 그룹화된 데이터에 조건을 적용할 수 있습니다. 

 

따라서 이 구문을 서브쿼리로 사용해서 결과를 도출하였다.

WITH c_nums AS (
    SELECT num
    FROM MyNumbers
    GROUP BY num
    HAVING COUNT(num) = 1
)
SELECT MAX(num) AS num
FROM c_nums

 

 

+ Recent posts