๐ธ [solvesql] ์ดํ ์ฐ์ ๋ฏธ์ธ๋จผ์ง๊ฐ ๋๋น ์ง ๋ (MySQL)
solvesql '์ดํ ์ฐ์ ๋ฏธ์ธ๋จผ์ง๊ฐ ๋๋น ์ง ๋ ' MySQL ํ์ด
๐ธ [solvesql] ์ดํ ์ฐ์ ๋ฏธ์ธ๋จผ์ง๊ฐ ๋๋น ์ง ๋ (MySQL)
๐ ๋ฌธ์ ์์ฝ
2022๋ ๋๊ธฐ ์ธก์ ๋ฐ์ดํฐ์์ ๋ฏธ์ธ๋จผ์ง(PM10) ๋๋๊ฐ ์ดํ ์ฐ์ ์ฆ๊ฐํ์ฌ 30ใ/ใฅ ์ด์์ด ๋ ๋ ์ง๋ฅผ ์กฐํํ๋ ๋ฌธ์ ์ด๋ค.
- ์กฐ๊ฑด
- 3์ผ ์ฐ์ ์ธก์ ๋ฐ์ดํฐ๊ฐ ์กด์ฌํด์ผ ํ๋ค.
- ๋ฏธ์ธ๋จผ์ง ๋๋๊ฐ ์ ๋ ๋ณด๋ค ์ฆ๊ฐํ๊ณ , ๊ทธ ์ ๋ ๋ ์ด์ ๋ ๋ณด๋ค ์ฆ๊ฐํด์ผ ํ๋ค.
- ์กฐํ ๋์ ๋ ์ง์ ๋ฏธ์ธ๋จผ์ง ๋๋๋
30ใ/ใฅ์ด์์ด์ด์ผ ํ๋ค. - ๊ฒฐ๊ณผ ์ปฌ๋ผ๋ช
์
date_alert๋ก ์ง์ ํ๋ค. - ๋ ์ง๋ฅผ ๊ธฐ์ค์ผ๋ก ์ค๋ฆ์ฐจ์ ์ ๋ ฌํ๋ค.
โ ํ์ด
SELECT์ค๋ ๋ ์งFROM์ค๋ ๋ ์ง ๊ธฐ์ค ์ด์ ๋ ์ง ๊ธฐ์ค ๊ทธ์ ๋ ์ง-
WHERE๊ทธ์ ๋ฏธ์ธ๋จผ์ง < ์ด์ ๋ฏธ์ธ๋จผ์ง < ์ค๋ ๋ฏธ์ธ๋จผ์ง AND ์ค๋ ๋ฏธ์ธ๋จผ์ง 30 ์ด์;๐ฝ
SELECT์ค๋ ๋ ์งFROM์ค๋ JOIN ์ด์ ON ์ค๋ ๋ ์ง = ์ด์ ๋ ์ง + 1์ผ JOIN ๊ทธ์ ON ์ด์ ๋ ์ง = ๊ทธ์ ๋ ์ง + 1-
WHERE๊ทธ์ ๋ฏธ์ธ๋จผ์ง < ์ด์ ๋ฏธ์ธ๋จผ์ง AND ์ด์ ๋ฏธ์ธ๋จผ์ง < ์ค๋ ๋ฏธ์ธ๋จผ์ง AND ์ค๋ ๋ฏธ์ธ๋จผ์ง >= 30;
โจ๏ธ SQL ์ฟผ๋ฆฌ
1
2
3
4
5
6
7
8
9
10
11
12
13
SELECT
curr.measured_at AS date_alert
FROM
measurements curr
JOIN measurements prev
ON curr.measured_at = DATE_ADD(prev.measured_at, INTERVAL 1 DAY)
JOIN measurements prev2
ON prev.measured_at = DATE_ADD(prev2.measured_at, INTERVAL 1 DAY)
WHERE
prev2.pm10 < prev.pm10
AND prev.pm10 < curr.pm10
AND curr.pm10 >= 30;
๐ก ํ์ด ํฌ์ธํธ
- ๊ฐ์ ํ ์ด๋ธ์ ์ฌ๋ฌ ๋ฒ ์กฐํํด์ผ ํ๋ ๊ฒฝ์ฐ Self Join์ ์ฌ์ฉํ์ฌ ํ๋์ ํ ์ด๋ธ์ ์ฌ๋ฌ ์ญํ ๋ก ๋๋์ด ์ฌ์ฉํ ์ ์๋ค.
- Self Join ์์๋
curr,prev,prev2์ ๊ฐ์ด ํ ์ด๋ธ ๋ณ์นญ์ ๋ถ์ฌํ๋ฉด ๊ฐ ํ์ ์ญํ ์ ๊ตฌ๋ถํ๊ธฐ ์ฝ๋ค. DATE_ADD()๋ฅผ ์ฌ์ฉํ๋ฉด ๋ ์ง์ ์ผ์ ๊ธฐ๊ฐ์ ๋ํ๊ฑฐ๋ ๋นผ์ ์ฐ์๋ ๋ ์ง์ ๋ฐ์ดํฐ๋ฅผ ์ฐ๊ฒฐํ ์ ์๋ค.WHERE์ ์์ ์ด์ ๋ ์ง์ ํ์ฌ ๋ ์ง์ ๊ฐ์ ๋น๊ตํ์ฌ ๋ฏธ์ธ๋จผ์ง ๋๋๊ฐ ์ดํ ์ฐ์ ์ฆ๊ฐํ๋ ์กฐ๊ฑด์ ํํํ ์ ์๋ค.- ์ฌ๋ฌ ์กฐ๊ฑด์
AND๋ฅผ ์ฌ์ฉํ์ฌ ๋ชจ๋ ๋ง์กฑํ๋ ๋ฐ์ดํฐ๋ง ์กฐํํ ์ ์๋ค. - MySQL 8.0 ์ด์์์๋ ์๋์ฐ ํจ์์ธ
LAG()๋ฅผ ์ฌ์ฉํ์ฌ ์ด์ ํ์ ๊ฐ์ ์กฐํํ๋ ๋ฐฉ์์ผ๋ก๋ ํด๊ฒฐํ ์ ์๋ค.- ๋ค๋ง
LAG()๋ ์ ๋ ฌ๋ ์ด์ ํ์ ๊ธฐ์ค์ผ๋ก ๊ฐ์ ๊ฐ์ ธ์ค๊ธฐ ๋๋ฌธ์, ๋ ์ง๊ฐ ์ฐ์๋์ด ์๋ค๋ ๋ณด์ฅ์ด ์๋ ๊ฒฝ์ฐ์๋ ์ค์ ์ฐ์๋ ๋ ์ง๋ฅผ ํ์ธํ ์ ์๋ค. ์ด๋ฌํ ๊ฒฝ์ฐ์๋DATE_ADD()๋ฅผ ์ด์ฉํ Self Join ๋ฐฉ์์ด ๋ ์ ํฉํ๋ค.
- ๋ค๋ง
๐ ๋ ๋ง์ solvesql ํ์ด
This post is licensed under
CC BY 4.0
by the author.