Post

๐ŸŒธ [solvesql] ์ดํ‹€ ์—ฐ์† ๋ฏธ์„ธ๋จผ์ง€๊ฐ€ ๋‚˜๋น ์ง„ ๋‚  (MySQL)

solvesql '์ดํ‹€ ์—ฐ์† ๋ฏธ์„ธ๋จผ์ง€๊ฐ€ ๋‚˜๋น ์ง„ ๋‚ ' MySQL ํ’€์ด

๐ŸŒธ [solvesql] ์ดํ‹€ ์—ฐ์† ๋ฏธ์„ธ๋จผ์ง€๊ฐ€ ๋‚˜๋น ์ง„ ๋‚  (MySQL)


๐Ÿ‘‰ solvesql - ์ดํ‹€ ์—ฐ์† ๋ฏธ์„ธ๋จผ์ง€๊ฐ€ ๋‚˜๋น ์ง„ ๋‚ 


๐Ÿ“Œ ๋ฌธ์ œ ์š”์•ฝ

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 ํ’€์ด

๐Ÿ‘‰ solvesql ํ’€์ด ์ „์ฒด ๋ณด๊ธฐ

This post is licensed under CC BY 4.0 by the author.