문제링크
https://leetcode.com/problems/biggest-single-number/
문제
Table: MyNumbers
+-------------+------+
| Column Name | Type |
+-------------+------+
| num | int |
+-------------+------+
This table may contain duplicates (In other words, there is no primary key for this table in SQL).
Each row of this table contains an integer.
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.
Example 1:
Input:
MyNumbers table:
+-----+
| num |
+-----+
| 8 |
| 8 |
| 3 |
| 3 |
| 1 |
| 4 |
| 5 |
| 6 |
+-----+
Output:
+-----+
| num |
+-----+
| 6 |
+-----+
Explanation: The single numbers are 1, 4, 5, and 6.
Since 6 is the largest single number, we return it.
Example 2:
Input:
MyNumbers table:
+-----+
| num |
+-----+
| 8 |
| 8 |
| 7 |
| 7 |
| 3 |
| 3 |
| 3 |
+-----+
Output:
+------+
| num |
+------+
| null |
+------+
Explanation: There are no single numbers in the input table so we return null.
내 접근
SELECT sub.num as num FROM (SELECT num, COUNT(*) as cnt FROM MyNumbers GROUP BY num) sub WHERE sub.cnt = 1 ORDER BY sub.num DESC LIMIT 1
input
| num |
| --- |
| 8 |
| 8 |
| 7 |
| 7 |
| 3 |
| 3 |
| 3 |
output
num |
---|
expected
| num |
| ---- |
| null |
GPT
In SQL, when you SELECT from an empty set but expect a single row with a NULL value when there are no results, one approach is to use a conditional query. You can use COALESCE with an OUTER JOIN or a UNION with a SELECT NULL to handle this scenario.
COALESCE 를 쓰라는데 COALESCE 는 뭔데?
COALESCE는 SQL에서 널(NULL) 값을 처리할 때 사용하는 함수로, 여러 인수를 받아 순서대로 NULL이 아닌 첫 번째 값을 반환합니다. COALESCE를 사용하면 데이터를 조회할 때 예상하지 못한 NULL 값이 나오는 경우 이를 대체할 수 있습니다.
기본 문법
COALESCE(expression1, expression2, ..., expressionN)
첫 번째로 NULL이 아닌 값을 반환하며, 모든 인수가 NULL일 경우 최종 결과도 NULL이 됩니다.
고객 테이블에서 PhoneNumber 열이 NULL인 경우 "Not Provided"라는 기본값을 표시하려면
SELECT CustomerName,
COALESCE(PhoneNumber, 'Not Provided') AS Phone
FROM Customers;
직원 테이블에서 사무실 전화(OfficePhone)가 NULL인 경우 개인 전화(PersonalPhone)를 표시하고, 둘 다 NULL이면 "No Contact"으로 표시하려면
SELECT EmployeeName,
COALESCE(OfficePhone, PersonalPhone, 'No Contact') AS ContactNumber
FROM Employees;
결과는 실패다. 왜냐하면 COALESCE는 NULL 을 만나면 다음 값을 반환하는 것인데
내가 뽑은 HAVING COUNT(num) = 1 에서 나온 값은 null 값이 아니기 때문이다.
이는 집계함수 등으로 묶어줘야 한다.
집계함수로 묶어야 겠다. 라고는 생각했는데 MAX()는 생각이 안 나고
orderby DESC, LIMIT 1 밖에 생각이 안 났다. 고심 끝에 찾아보고 정답을 알 수 있었다.
정답 쿼리.
SELECT MAX(num) AS num FROM ( SELECT num FROM MyNumbers GROUP BY num HAVING COUNT(num) = 1 ) as sub