데이터 분석

solvesql | 다음날도 서울숲의 미세먼지 농도는 나쁨 😵‍💫 본문

SQL/solvesql

solvesql | 다음날도 서울숲의 미세먼지 농도는 나쁨 😵‍💫

딱한아이 2025. 1. 24. 12:16
다음날도 서울숲의 미세먼지 농도는 나쁨 😢

✔️0217 복습

 

문제 조건

1. 당일의 미세먼지 농도보다 바로 다음날의 미세먼지 농도가 더 안 좋은 날을 출력

2. 쿼리 결과는 당일, 다음날, 당일의 미세먼지 농도, 다음날의 미세먼지 농도 컬럼을 포함

 

Solution

 

✔️ 쿼리 1 : 셀프조인을 이용하여 해결

SELECT m1.measured_at AS today
     , m2.measured_at AS next_day
     , m1.pm10
     , m2.pm10 AS next_pm10
FROM measurements m1
  JOIN measurements m2 ON m2.measured_at = DATE_ADD(m1.measured_at, INTERVAL 1 DAY)
WHERE m1.pm10 < m2.pm10

/*
WITH preprocessed AS (
SELECT measured_at AS today
     , (
        SELECT measured_at
        FROM measurements m2
        WHERE m2.measured_at = DATE_ADD(m1.measured_at, INTERVAL 1 DAY)
       ) AS next_day
     , pm10
     , (
        SELECT pm10
        FROM measurements m2
        WHERE m2.measured_at = DATE_ADD(m1.measured_at, INTERVAL 1 DAY)
       ) AS next_pm10  
FROM measurements m1

)
SELECT *
FROM preprocessed
WHERE pm10 < next_pm10
*/

 

✅ JOIN 조건을 통해 m2 테이블의 측정 일시가 m1의 측정 일시의 다음날과 일치하도록 한다

당일보다 다음날 미세먼지 농도가 더 높은 조건을 추가한다

 

✔️ 쿼리 2 :  윈도우 함수 LEAD()를 이용하여 해결

SELECT *
FROM (
  SELECT measured_at AS today
       , LEAD(measured_at, 1) OVER(ORDER BY measured_at) AS next_day
       , pm10
       , LEAD(pm10, 1) OVER(ORDER BY measured_at) AS next_pm10
  FROM measurements
) measure_pm10
WHERE pm10 < next_pm10

 

 

✅ LEAD 함수를 활용하여 다음날, 다음날의 미세먼지 농도 정보를 가져온다

✅ SELECT절에서 윈도우 함수로 연산한 컬럼은 WHERE절에서 바로 불러 사용할 수 없기 때문에 FROM절에 활용한다

✅ 당일보다 다음날 미세먼지 농도가 더 높은 조건을 추가한다