solvesql - SQL문제

solvesql - 다음날도 서울숲의 미세먼지 농도는 나쁨 😢(SubQuery, WITH)

정차노 2024. 11. 1. 21:29

문제 출처 : 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. 실행 결과