01. 작성쿼리
SELECT
t.measured_at AS date_alert
FROM
measurements AS y
JOIN measurements AS m
ON m.measured_at = y.measured_at + INTERVAL 1 DAY
JOIN measurements AS t
ON t.measured_at = m.measured_at + INTERVAL 1 DAY
WHERE
m.pm10 > y.pm10
AND t.pm10 > m.pm10
AND t.pm10 >= 30
ORDER BY
t.measured_at;
02. 쿼리 결과

03. 풀이 포인트
point 1 ) 두 번의 셀프 조인
셀프 조인을 해서 어제와 오늘을 비교하는 문제를 많이 보셨을겁니다
해당 문제도 어제와 오늘을 비교하면 아래와 같은 쿼리가 나옵니다
SELECT
yes.measured_at AS '어제',
t.measured_at AS '오늘',
yes.pm10 AS '어제pm',
t.pm10 AS '오늘pm'
FROM
measurements AS yes
JOIN measurements AS t
ON t.measured_at = yes.measured_at + INTERVAL 1 DAY
WHERE
t.pm10 > yes.pm10
AND yes.pm10 >= 30
ORDER BY
t.measured_at;

하지만 이 문제는 이틀 연속 수치가 나빠진 경우라는 조건이기 때문에
셀프조인이 두 번 들어가야합니다.
SELECT
y.measured_at AS 'day1',
m.measured_at AS 'day2',
t.measured_at AS 'day3',
y.pm10 AS 'day1_pm',
m.pm10 AS 'day2_pm',
t.pm10 AS 'day3_pm'
FROM
measurements AS y
JOIN measurements AS m
ON m.measured_at = y.measured_at + INTERVAL 1 DAY
JOIN measurements AS t
ON t.measured_at = m.measured_at + INTERVAL 1 DAY
WHERE
m.pm10 > y.pm10
AND t.pm10 > m.pm10
AND t.pm10 >= 30
ORDER BY
t.measured_at;

여기서 또하나 놓치면 안되는건 WHERE절에서
t.pm >= 30 여기서 수치가 30 이상이 된 날은 마지막 날이라는 겁니다
이틀 연속으로 수치가 나빠져서 30㎍/㎥ 이상이 된 날 이라고 되어있기 때문에 이 부분을 놓치면 안됩니다!
설명에 쓰이는 쿼리와 답안 쿼리의 SELECT 부분이 다른건 이해를 돕기 위한 것으로 생각해주세요^^
point 2) INTERVAL 의 사용
JOIN의 조건을 사용할 때 INTERVAL을 사용했습니다
INTERVAL은 DATE 연산에 쓰는 키워드 문법입니다
아래와 같이 날짜의 날짜간의 간격 즉, 기간을 표현하는 문법이죠
date_column + INTERVAL 1 DAY
date_column - INTERVAL 7 DAY
date_column + INTERVAL 2 MONTH
date_column - INTERVAL 3 HOUR
문제에서는 전날과 그 다음날을 비교해야했기 때문에 이렇게 키워드 문법을 사용해서 JOIN을 진행했습니다
이번 문제는 난이도는 2였지만 셀프조인과 INTERVAL을 몰랐다면 복잡해졌을 것같네요
그리고 문제를 명확히 정의하고 이해해야했습니다.
역시 sql은 매일 풀지 않으면 까먹고 ㅎㅎㅎ 꾸준함이 필요한 언어라는 것을 다시 한 번 느끼게되었습니다 하하핳
'코딩 테스트 > 02. SQL' 카테고리의 다른 글
| [solvesql]Advent of SQL 2025 9일차 (0) | 2025.12.14 |
|---|---|
| (solvesql)Advent of SQL 2025 8일차 (0) | 2025.12.14 |
| (solvesql) Advent of SQL 2025 6일차 (0) | 2025.12.08 |
| (solvesql) Advent of SQL 2025 5일차 (0) | 2025.12.08 |
| [solvesql_Lv3] 미세먼지 수치의 계절간 차이(중앙값구하기) (0) | 2025.10.14 |
