문제 :
기준일 하루전과 기준일의 온도차이를 비교하고 온도가 높은 날을 출력하시오.
예시 데이터와 출력 데이터
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을 활용한 문제가 많이 나오니 주의하도록 하자!
'SQL > 코딩테스트' 카테고리의 다른 글
[MySQL] INNER JOIN과 LEFT JOIN 쓰임 / COUNT(DISTINCT) (0) | 2024.11.07 |
---|---|
[MySQL] 대칭 쌍 문제(Symmetric Pairs) (0) | 2024.11.06 |
[MySQL] Self Join (0) | 2024.11.05 |
[MySQL] 그룹변수가 2개로 피벗테이블 구성 (0) | 2024.11.05 |
[MySQL] SQL로 피벗테이블 만드는 순서(데이터 피봇팅) (0) | 2024.11.05 |