Tools/- SQL

[SQL] solvesql | ์ „๋ ฅ ์†Œ๋น„๋Ÿ‰ ์ด๋™ ํ‰๊ท  ๊ตฌํ•˜๊ธฐ | rows ์™€ range์˜ ์ฐจ์ด

์Šค์œ„๋ฏผ 2025. 2. 9. 21:14

๋ฌธ์ œ

https://solvesql.com/problems/moving-average-of-power-consumption/

 

https://solvesql.com/problems/moving-average-of-power-consumption/

 

solvesql.com

 

์ฝ”๋“œ

SELECT
  datetime(measured_at, '+10 minutes') end_at, -- SQLite์—์„œ ์‹œ๊ฐ„ ๋”ํ•˜๋Š” ํ•จ์ˆ˜
  round(avg(zone_quads) OVER (ORDER BY measured_at ROWS BETWEEN 5 PRECEDING AND CURRENT ROW), 2) zone_quads,
  round(avg(zone_smir) OVER (ORDER BY measured_at ROWS BETWEEN 5 PRECEDING AND CURRENT ROW), 2) zone_smir,
  round(avg(zone_boussafou) OVER (ORDER BY measured_at ROWS BETWEEN 5 PRECEDING AND CURRENT ROW), 2) zone_boussafou
FROM power_consumptions
WHERE measured_at BETWEEN '2017-01-01 00:00:00' AND '2017-02-01 00:00:00'

 

ํ’€์ด

1. window ํ•จ์ˆ˜ ๋ฒ”์œ„ ์ง€์ •ํ•ด์„œ ์ด๋™ํ‰๊ท  ๊ตฌํ•˜๊ธฐ

measured_at์€ 10๋ถ„ ๋‹จ์œ„์ด๋‹ค.  ๋”ฐ๋ผ์„œ, 1์‹œ๊ฐ„ ์ด๋™ํ‰๊ท ์„ ๊ตฌํ•˜๊ธฐ ์œ„ํ•ด ์ด์ „ 5๊ฐœ์˜ ํ–‰๋ถ€ํ„ฐ ํ˜„์žฌ ํ–‰๊นŒ์ง€์˜ ํ‰๊ท ์„ ๊ตฌํ•˜๋ฉด ๋œ๋‹ค.

end_at (์ด๋™ ํ‰๊ท  ๋ฒ”์œ„์˜ ๋ ์‹œ๊ฐ)์˜ ์ฒซ ํ–‰์ด '2017-01-01 00:10:00' ์ด๊ธฐ ๋•Œ๋ฌธ์— ํ˜„์žฌ ํ–‰์—์„œ following (๋‹ค์Œ ํ–‰)์˜ ํ‰๊ท ์ด ์•„๋‹Œ preceding (์ด์ „ ํ–‰)์„ ์‚ฌ์šฉํ•ด์•ผ ํ•จ์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค. ์ด ๋ถ€๋ถ„์ด ๊ฝค๋‚˜ ํ—ท๊ฐˆ๋ ธ๋‹ค.

 

๋˜ range between์„ ์‚ฌ์šฉํ•ด๋ดค๋Š”๋ฐ ๊ฒฐ๊ณผ๊ฐ’์ด ๋‹ฌ๋ž๋‹ค. ์‚ฌ์‹ค rows ์™€ range์˜ ์ฐจ์ด๋ฅผ ์ดํ•ดํ•˜์ง€ ๋ชปํ•˜๊ณ  ์žˆ์—ˆ๋Š”๋ฐ

์ด์ œ ๋น„๋กœ์†Œ ์ดํ•ดํ–ˆ๋‹ค. ์•„๋ž˜์— ์„ค๋ช…์„ ์ถ”๊ฐ€ํ•˜๊ฒ ๋‹ค

 

2. measured_at ๋‚ ์งœ ๋ฒ”์œ„ ์ง€์ •ํ•˜๊ธฐ

end_at(measured_at + 10๋ถ„) ์˜ ๋งˆ์ง€๋ง‰ ํ–‰์ด '2017-02-01 00:00:00'์ด๊ธฐ ๋•Œ๋ฌธ์—

where์ ˆ์—์„œ measured_at์˜ ๋‚ ์งœ ๋ฒ”์œ„์˜ ๋์„ '2017-01-31 23:50:00'์œผ๋กœ ์„ค์ •ํ•ด์•ผ ํ•˜๋Š” ๊ฒŒ ์•„๋‹Œ๊ฐ€? ์ƒ๊ฐํ–ˆ๋Š”๋ฐ ์•„๋‹ˆ์˜€๋‹ค

์ด์ƒํ•˜๊ฒŒ '2017-02-01 00:00:00'์œผ๋กœ ์„ค์ •ํ•ด์•ผ์ง€ '2017-01-31 23:50:00'๊นŒ์ง€ ๊ฒฐ๊ณผ๊ฐ€ ๋‚˜์˜จ๋‹ค...

between์€ ์–‘ ๋ ๊ฐ’์„ ํฌํ•จํ•˜๋Š” ์กฐ๊ฑด์œผ๋กœ ์•Œ๊ณ  ์žˆ๋Š”๋ฐ ์™œ ์œ„์—์ฒ˜๋Ÿผ ํ•ด์•ผํ•˜๋Š”์ง€ ์•„์ง ์˜๋ฌธ์ด๋‹ค ...

 

3. measured_at์— ์‹œ๊ฐ„ ๋”ํ•˜๊ธฐ

์‹œ๊ฐ„์„ ๋”ํ•˜๋Š” ํ•จ์ˆ˜๋กœ dateadd์„ ์‚ฌ์šฉํ•ด์„œ dateadd(minute, 10, measured_at)์„ ์ ์—ˆ์ง€๋งŒ ๊ฒฐ๊ณผ๋Š” ์˜ค๋ฅ˜

SQLite๋Š” datetime(measured_at, '+10 minutes') ์ด๋Ÿฐ ์‹์œผ๋กœ ์‹œ๊ฐ„์„ ๋”ํ•ด์ค€๋‹ค.

 

๐Ÿ’ก Rows ์™€ Range์˜ ์ฐจ์ด

Rows
- ํ–‰ (Row) ๋‹จ์œ„๋กœ ๊ณ„์‚ฐ
- ํ˜„์žฌ ํ–‰์„ ๊ธฐ์ค€์œผ๋กœ ์ด์ „ 5ํ–‰๋ถ€ํ„ฐ ํ˜„์žฌํ–‰๊นŒ์ง€ ํฌํ•จํ•˜์—ฌ ํ‰๊ท ์„ ๊ณ„์‚ฐ

Range
- ๊ฐ’ (Value) ๋ฒ”์œ„ ๊ธฐ๋ฐ˜์œผ๋กœ ๊ณ„์‚ฐ
- ORDER BY measured_at ๊ธฐ์ค€์—์„œ ํ˜„์žฌ ํ–‰์˜ measured_at ๊ฐ’์—์„œ 5์ดˆ ์ด์ „๊นŒ์ง€์˜ ๊ฐ’๋“ค์„ ํฌํ•จํ•˜์—ฌ ํ‰๊ท ์„ ๊ณ„์‚ฐ
- measured_at์— ๋™์ผํ•œ ๊ฐ’์„ ๊ฐ€์ง„ ํ–‰์ด ์žˆ์œผ๋ฉด ํ•œ ํ–‰์œผ๋กœ ์ทจ๊ธ‰

Range์„ ์‚ฌ์šฉํ•ด์„œ ์ด ๋ฌธ์ œ๋ฅผ ํ’€๋ ค๋ฉด
      RANGE BETWEEN INTERVAL '50 minutes' PRECEDING AND CURRENT ROW
์ด๋ ‡๊ฒŒ measured_at ๊ฐ’์˜ ๋‹จ์œ„(์—ฌ๊ธฐ์„œ๋Š” ์‹œ๊ฐ„ ๋‹จ์œ„)๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ๋ฒ”์œ„๋ฅผ ๊ณ„์‚ฐํ•ด์•ผ ํ•œ๋‹ค.

 

 

๋А๋‚€ ์ 

window ํ•จ์ˆ˜ ๋ฒ”์œ„ ์ง€์ •ํ•˜๋Š” ๋ฌธ๋ฒ•์— ๋” ์ต์ˆ™ํ•ด์ ธ์•ผ๊ฒ ๋‹ค

 

์ฐธ๊ณ 

https://gent.tistory.com/473

 

[Oracle] ROWS์™€ RANGE ์ฐจ์ด ๋ฐ ์‚ฌ์šฉ๋ฒ• (WINDOWING ์ ˆ)

์˜ค๋ผํด์—์„œ OVER ์ ˆ์— WINDOWING ์ ˆ์„ ์ฒ˜์Œ ์‚ฌ์šฉํ•  ๋•Œ ROWS์™€ RANGE๊ฐ€ ์–ด๋–ค ์ฐจ์ด์ ์ด ์žˆ๋Š”์ง€ ๋งŽ์ด ํ—ท๊ฐˆ๋ฆด ์ˆ˜ ์žˆ๋‹ค. ๊ฐ„๋‹จํžˆ ์„ค๋ช…ํ•˜๋ฉด ROWS๋Š” ๊ฐ ํ–‰์˜ ์œ„์น˜๊ณ , RANGE๋Š” ๊ฐ’์˜ ๋ฒ”์œ„๋ผ๊ณ  ์ƒ๊ฐํ•˜๋ฉด ๋œ๋‹ค. ์•„๋ž˜์˜

gent.tistory.com

 

์ด ๋ธ”๋กœ๊ทธ๊ฐ€ rows์™€ range์˜ ์ฐจ์ด๋ฅผ ์ง๊ด€์ ์œผ๋กœ ์ž˜ ์ดํ•ด๋˜๊ฒŒ ์„ค๋ช…ํ•ด๋†จ๋‹ค ! ์ฐธ๊ณ  ๋ฐ”๋žŒ !