본문 바로가기
SQL/코딩테스트

[MySQL] Self join을 활용한 코딩테스트 주의사항

by Nanki 2024. 11. 5.

문제 :

기준일 하루전과 기준일의 온도차이를 비교하고 온도가 높은 날을 출력하시오.

 

예시 데이터와 출력 데이터

Input: 
Weather table:
+----+------------+-------------+
| id | recordDate | temperature |
+----+------------+-------------+
| 1  | 2015-01-01 | 10          |
| 2  | 2015-01-02 | 25          |
| 3  | 2015-01-03 | 20          |
| 4  | 2015-01-04 | 30          |
+----+------------+-------------+
Output: 
+----+
| id |
+----+
| 2  |
| 4  |
+----+

 

풀이 매크로 :

1. 같은 테이블내 행끼리  비교해야 하므로 Self join을 활용한다.

2. Self join시 기준날짜와 이후날짜를 같게해야 한다. 즉, 기준일로부터 -1일을 한다.
/ DATE_ADD(기준일, INTERVAL 숫자 날짜 또는 시간)

3. SELECT 문 작성시 같은 이름의 변수이므로 AS를 주어 구별하도록 작성한다.

 

코드 :

SELECT w1.Id
    /*,w1.recordDate AS Today_Date
    ,w1.temperature AS Today_temp
    ,Yes.recordDate AS Yes_Date
    ,Yes.temperature AS Yes_temp*/
FROM Weather AS w1
    INNER JOIN Weather AS Yes
    ON w1.recordDate = DATE_ADD(Yes.recordDate, INTERVAL 1 DAY)
WHERE w1.temperature > Yes.temperature
;

 

잘못된 풀이

사실.. 문제에서는 날짜를 더하라고 했지만 예시 데이터 내 ID가 날짜에 따라서 1씩 증가함을 보고 날짜 변수를 안쓰고 ID변수를 써서 문제를 풀었다.

SELECT w1.Id
    /*,w1.recordDate AS Today_Date
    ,w1.temperature AS Today_temp
    ,Yes.recordDate AS Yes_Date
    ,Yes.temperature AS Yes_temp*/
FROM Weather AS w1
    INNER JOIN (
                SELECT id + 1 AS id , temperature, recordDate
                FROM Weather AS Yes
                ) AS Yes
    ON w1.Id = Yes.Id
WHERE w1.temperature > Yes.temperature
;

 

그러나 제출시 오답이 나왔고 해당 샘플 데이터를 보니 ID를 활용한 문제풀이를 막아놨었다.

| id | recordDate | temperature |
| -- | ---------- | ----------- |
| 1  | 2000-12-16 | 3           |
| 2  | 2000-12-15 | -1          |

 

오늘의 교훈

1. 문제에서 활용하라는 변수만을 쓰자

2. 굳이 Sub 쿼리를 안쓰더라도 ON에서 해당 변수를 커스텀해서 사용할 수 있었다.

 

SQL 기출에서 self join을 활용한 문제가 많이 나오니 주의하도록 하자!