λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°
πŸ›‹οΈ 데이터 뢄석/πŸͺ‘ SQL QUERY TEST

[Advent of SQL 2024 πŸŽ„] μ „λ ₯ μ†ŒλΉ„λŸ‰ 이동 평균 κ΅¬ν•˜κΈ° (Day 14)

by 유슀 :) 2024. 12. 14.
λ°˜μ‘ν˜•

λ‚œμ΄λ„4

 

 

Power Consumption of Tetouan City λ°μ΄ν„°λ² μ΄μŠ€λŠ” λͺ¨λ‘œμ½” 뢁뢀 λ„μ‹œ 쀑 ν•˜λ‚˜μΈ ν…Œνˆ¬μ•ˆ μ§€μ—­μ˜ μ „λ ₯ μ†ŒλΉ„λŸ‰κ³Ό 기상 κ΄€μΈ‘μΉ˜κ°€ λ“€μ–΄μžˆλŠ” λ°μ΄ν„°λ² μ΄μŠ€ μž…λ‹ˆλ‹€. ν…Œνˆ¬μ•ˆ μ§€μ—­μ—λŠ” Quads, Smir, Boussafou 총 3개 지역에 λ°œμ „μ†Œκ°€ 있으며 ν•΄λ‹Ή λ°œμ „μ†Œλ‘œ λΆ€ν„°μ˜ μ „λ ₯ μ†ŒλΉ„λŸ‰μ΄ 각각 μΈ‘μ •λ˜μ–΄ μžˆμŠ΅λ‹ˆλ‹€. μ „λ ₯ μ†ŒλΉ„λŸ‰ 츑정은 λ§€ 10λΆ„λ§ˆλ‹€ μ‹œμž‘ν•΄ 10λΆ„κ°„ μ§„ν–‰ν•˜λŠ” 방식이고, measured_at μ»¬λŸΌμ— μΈ‘μ • μ‹œμž‘ μ‹œκ°μ΄ κΈ°λ‘λ˜μ–΄ μžˆμŠ΅λ‹ˆλ‹€. μ „λ ₯ μ†ŒλΉ„λŸ‰μ€ μˆœκ°„μˆœκ°„ 크게 λ³€ν™”ν•˜λŠ” 값이기에 νŠΈλ Œλ“œλ₯Ό λ³΄κ±°λ‚˜ μˆ˜μš” μ˜ˆμΈ‘μ„ ν•˜κΈ° μœ„ν•΄μ„œ λ‹¨μˆœ 이동 평균을 자주 μ‚¬μš© ν•©λ‹ˆλ‹€.

2017λ…„ 1μ›” 1일 0μ‹œλΆ€ν„° 2017λ…„ 2μ›” 1일 0μ‹œκΉŒμ§€ 10λΆ„ λ‹¨μœ„λ‘œ 3개 λ°œμ „μ†Œ μ „λ ₯ μ†ŒλΉ„λŸ‰μ˜ 1μ‹œκ°„ λ²”μœ„ λ‹¨μˆœ 이동 평균을 κ³„μ‚°ν•˜λŠ” 쿼리λ₯Ό μž‘μ„±ν•΄μ£Όμ„Έμš”. 평균을 λ‚΄κΈ° μœ„ν•œ λ°μ΄ν„°μ˜ λ²”μœ„κ°€ 1μ‹œκ°„λ³΄λ‹€ μž‘μ€ 경우 ν•΄λ‹Ή λ²”μœ„μ— ν¬ν•¨λ˜λŠ” μΈ‘μ • κ°’λ§Œ 평균 계산에 ν¬ν•¨μ‹œμΌœμ£Όμ„Έμš”. 쿼리 κ²°κ³Όμ—λŠ” μ•„λž˜ 컬럼이 ν¬ν•¨λ˜μ–΄ μžˆμ–΄μ•Ό ν•˜κ³ , 이동 평균 값은 μ†Œμˆ˜μ  μ…‹μ§Έ μžλ¦¬μ—μ„œ 반올림 ν•΄ λ‘˜μ§Έ μžλ¦¬κΉŒμ§€ ν‘œμ‹œλ˜μ–΄μ•Ό ν•©λ‹ˆλ‹€.

  • end_at: 이동 평균 λ²”μœ„μ˜ 끝 μ‹œκ°
  • zone_quads: Quads μ§€μ—­ μ „λ ₯ μ†ŒλΉ„λŸ‰μ˜ 1μ‹œκ°„ λ‹¨μˆœ 이동 평균
  • zone_smir: Smir μ§€μ—­ μ „λ ₯ μ†ŒλΉ„λŸ‰μ˜ 1μ‹œκ°„ λ‹¨μˆœ 이동 평균
  • zone_boussafou: Boussafou μ§€μ—­ μ „λ ₯ μ†ŒλΉ„λŸ‰μ˜ 1μ‹œκ°„ λ‹¨μˆœ 이동 평균

 

WITH averages AS (
    SELECT 
        strftime('%Y-%m-%d %H:%M:%S', measured_at, '+10 minutes') AS end_at,
        ROUND(AVG(zone_quads) OVER (ORDER BY measured_at ROWS BETWEEN 5 PRECEDING AND CURRENT ROW), 2) AS zone_quads,
        ROUND(AVG(zone_smir) OVER (ORDER BY measured_at ROWS BETWEEN 5 PRECEDING AND CURRENT ROW), 2) AS zone_smir,
        ROUND(AVG(zone_boussafou) OVER (ORDER BY measured_at ROWS BETWEEN 5 PRECEDING AND CURRENT ROW), 2) AS zone_boussafou
    FROM 
        power_consumptions
    WHERE 
        measured_at BETWEEN '2017-01-01 00:00:00' AND '2017-02-01 00:00:00'
)
SELECT 
    end_at,
    zone_quads,
    zone_smir,
    zone_boussafou
FROM 
    averages
ORDER BY 
    end_at;
λ°˜μ‘ν˜•