업로드가 좀 늦은 감이 있는데, 일이 좀 많았어서...ㅎㅎ..
이번 2단계 문제는 총 11개였고 대부분 JOIN, CASE/IF를 써야하는 문제들이 많았다.
사진에 있는 문제를 세보면 10개인 것을 알 수 있다.
그렇다. 1문제는 못풀었다..
정답률은 다른 문제들보다 많이 높았는데, SQLite를 안써봐서 그런가 라는 핑계를 대본다.
한번 오답노트를 적어보도록 하겠다.
문제는 아래 링크와 같다.
https://solvesql.com/problems/bad-finedust-measure/
[문제]
서울숲 일별 평균 대기오염도 데이터셋은 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 |