solvesql - 다음날도 서울숲의 미세먼지 농도는 나쁨 😢(SubQuery, WITH)
문제 출처 : https://solvesql.com/problems/bad-finedust-measure/
https://solvesql.com/problems/bad-finedust-measure/
solvesql.com
1. 문제
난이도2, 정답률 64.58%
서울숲 일별 평균 대기오염도 데이터셋은 2022년 서울숲 대기오염도 측정소에서 매일 기록한 대기오염 정보를 담고 있습니다.
measurements 테이블의 pm10 컬럼에는 다양한 대기오염도 측정 기준 중에서도 미세먼지(PM10) 농도가 기록되어 있습니다. 이 데이터를 이용하여 당일의 미세먼지 농도보다 바로 다음날의 미세먼지 농도가 더 안좋은 날을 찾아주세요. 결과는 아래 컬럼들을 포함해야 합니다.
- today: 당일 (YYYY-MM-DD)
- next_day: 다음날 (YYYY-MM-DD)
- pm10: 당일의 미세먼지 농도
- next_pm10: 다음날의 미세먼지 농도
2. 조건
- 당일의 미세먼지 농도보다 내일의 미세먼지 농도가 더 안좋은날 찾기
3. 쿼리
-- 당일의 미세먼지 농도보다 바로 다음날의 미세먼지 농도가 더 안좋은날 찾기
SELECT
measured_at AS today
,Date(m1.measured_at, '+1 days') AS next_day
,m1.pm10 AS pm10
,(SELECT m2.pm10 FROM measurements AS m2 WHERE Date(m1.measured_at, '+1 days') = m2.measured_at) AS next_pm10
FROM measurements AS m1
WHERE m1.pm10 < next_pm10
조건이 좀 심플한데 당일의 미세먼지 농도보다 다음날의 미세먼지 농도가 더 안좋은날을 찾아야 한다. 다만 쿼리 내에서 내일의 미세먼지 농도를 구하려면 서브쿼리를 사용하여 다음날의 농도를 구한다음 비교를 해야한다.
WITH문을 사용해서도 구할 수 있다. WITH문을 사용해 임시로 사용할 쿼리를 구현한 뒤 당일과 내일의 날짜값을 조인하여 한번에 데이터를 조회한 뒤 데이터를 구할 수도 있다.
-- 당일의 미세먼지 농도보다 바로 다음날의 미세먼지 농도가 더 안좋은날 찾기
WITH tomorrow AS(
SELECT
*
FROM measurements
)
SELECT
m.measured_at AS today
,t.measured_at AS next_day
,m.pm10 AS pm10
,t.pm10 AS next_pm10
FROM measurements AS m
JOIN tomorrow AS t ON DATE(m.measured_at, '+1 days') = t.measured_at
WHERE m.pm10 < t.pm10
뭔가 해당 방식이 더 깔끔한것 같기도 하다.
다만 WITH문을 사용할때는 이미 한번 다른 쿼리에 사용한 뒤에는 재사용이 어려우니 주의하자.
4. 실행 결과