본문 바로가기
Study/SQL

[solvesql] 2단계 쿼리문제 해결

by kimdapadata 2024. 12. 2.

 

업로드가 좀 늦은 감이 있는데, 일이 좀 많았어서...ㅎㅎ..

 

이번 2단계 문제는 총 11개였고 대부분 JOIN, CASE/IF를 써야하는 문제들이 많았다.

 

 

 

사진에 있는 문제를 세보면 10개인 것을 알 수 있다.

 

그렇다. 1문제는 못풀었다..

 

정답률은 다른 문제들보다 많이 높았는데, SQLite를 안써봐서 그런가 라는 핑계를 대본다.

 

한번 오답노트를 적어보도록 하겠다.

 

 


 

문제는 아래 링크와 같다.

https://solvesql.com/problems/bad-finedust-measure/

 

https://solvesql.com/problems/bad-finedust-measure/

 

solvesql.com

 

[문제]

서울숲 일별 평균 대기오염도 데이터셋은 2022년 서울숲 대기오염도 측정소에서 매일 기록한 대기오염 정보를 담고 있습니다.

measurements 테이블의 pm10 컬럼에는 다양한 대기오염도 측정 기준 중에서도 미세먼지(PM10) 농도가 기록되어 있습니다. 이 데이터를 이용하여 당일의 미세먼지 농도보다 바로 다음날의 미세먼지 농도가 더 안좋은 날을 찾아주세요. 결과는 아래 컬럼들을 포함해야 합니다.

 

- today: 당일 (YYYY-MM-DD)

- next_day: 다음날 (YYYY-MM-DD)

- pm10: 당일의 미세먼지 농도

- next_pm10: 다음날의 미세먼지 농도

 

 


 

 

아래는 정답 코드이다.

WITH measurements2 AS(
  SELECT measured_at AS today,
         pm10,
         LEAD(measured_at) OVER (ORDER BY measured_at) AS next_day,
         LEAD(pm10) OVER (ORDER BY measured_at) AS next_pm10
  FROM measurements
)
SELECT today,
       next_day,
       pm10,
       next_pm10
FROM measurements2
WHERE pm10 < next_pm10;

 

 

우선 내가 조금 익숙하지 않은 WITH 함수와 LEAD 함수를 사용해서 푸는 문제였다.

한번 천천히 살펴보겠다.

WITH measurements2 AS(
  SELECT measured_at AS today,
         pm10 AS pm10,
         LEAD(measured_at) OVER (ORDER BY measured_at) AS next_day,
         LEAD(pm10) OVER (ORDER BY measured_at) AS next_pm10
  FROM measurements
)

 

여기서 LEAD 함수가 나오는데 사용법은 다음과 같다.

LEAD(다음 값을 가지고 오고 싶은 컬럼) OVER (ORDER BY 정렬의 기준이 되는 컬럼

이 LEAD 함수를 사용하면 다음날의 날짜와 다음날의 pm10을 갖고 올 수 있게 된다.

 

그리고 WITH 함수로 임시 테이블을 만든 후에

 

SELECT today,
       next_day,
       pm10,
       next_pm10
FROM measurements2
WHERE pm10 < next_pm10;

 

마지막 조건인

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

을 WHERE 절로 걸어주면 끝이다!

 


 

이 문제 덕분에 LEAD() 함수를 알게 되었다.

 

다음에 나오면 기똥차게 풀어야지!

 

'Study > SQL' 카테고리의 다른 글

[DuckDB] 0. DuckDB에 대하여  (0) 2024.11.12
[solvesql] 1단계 쿼리문제 해결  (3) 2024.11.03
[solvesql] SQLite 쿼리 연습 문제(2024-10-26 ~ )  (0) 2024.10.26