inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

다양한 사례로 익히는 SQL 데이터 분석

가중 이동 평균 매출 SQL로 구하기

가중이동평균매출 lag함수 활용

2

sukang73

작성한 질문수 2

0

안녕하세요. 강사님

강사님께서 26강 5일 가중이동평균 문제풀이 해주신 방법외에 아래와 같이 lag 함수 활용해서 문제 풀어도 현업에서 사용하기 문제 없을까요?


with temp_01 as

(select a.order_date as d_day, sum(b.amount) as sum_amount

, row_number() over(order by date(a.order_date) asc) as rnum

from nw.orders a

join nw.order_items b on a.order_id = b.order_id

where a.order_date >= date('1996-07-08')

group by a.order_date)

, temp_02 as

(

select *

, count(*) over(order by d_day rows between 4 preceding and current row) as cnt

, avg(sum_amount) over(order by d_day rows between 4 preceding and current row) as m_avg_5days #일반 이동평균 구하기

,

( lag(sum_amount,1) over(order by d_day) * 1

+ lag(sum_amount,2) over(order by d_day) * 1

+ lag(sum_amount,3) over(order by d_day) * 1

+ lag(sum_amount,4) over(order by d_day) * 0.5

+ sum_amount * 1.5 ) / 5 as w_m_avg_5days #5일 가중이동평균 구하기

from temp_01

order by d_day

)

select *

from temp_02

where rnum >= 5;

이런식으로 풀어도 괜찮을까요?

현업에서 활용할때 어떤 방식이 더 효율적일지 궁금합니다!

sql postgresql dbms/rdbms 데이터-엔지니어링 data-analysis

답변 1

0

인프런 AI 인턴

안녕하세요, 인프런 AI 인턴입니다. sukang73님 질문과 관련하여 아래 기존 답변을 참고해 보시면 도움이 될 것 같습니다.

관련 답변

가중이동평균

LAG() 함수를 이용해 이전 행의 매출액을 가져와 가중치를 곱하는 방식으로 가중이동평균을 계산하는 것은 현업에서도 사용할 수 있는 방법입니다. 특히 가중치가 고정된 5일 이동평균이라면 질문자님처럼 LAG(sum_amount, n)을 활용해 구현할 수 있습니다.

다만 다음 사항은 확인하는 것이 좋습니다.

  • LAG()의 기준은 날짜가 아니라 행(row)입니다. 따라서 특정 날짜에 데이터가 없으면 실제 달력 기준 5일이 아닌, 데이터가 존재하는 최근 5개 행을 기준으로 계산할 수 있습니다.
  • order_date에 시간이 포함되어 있다면 일자별 집계를 위해 date(order_date) 또는 date_trunc('day', order_date) 등을 사용해야 합니다.
  • 가중치가 변경되거나 이동 기간이 길어지면 LAG()를 여러 번 작성해야 하므로 쿼리 유지보수성이 떨어질 수 있습니다.
  • where rnum >= 5로 초기 4개 행을 제외하는 방식은 완전한 5개 기간이 만들어진 이후부터 계산하려는 목적이라면 적절합니다. 다만 rnum이 실제 날짜 순서와 일치하는지 확인해야 합니다.
  • 이동평균 계산에서는 날짜가 누락될 수 있으므로, 실무에서는 날짜 캘린더 테이블을 조인하여 날짜를 보정한 뒤 계산하는 경우도 있습니다.

즉, 고정된 5일 가중이동평균을 계산하고 데이터 누락이 없다면 질문자님의 LAG() 방식도 충분히 활용할 수 있습니다. 반면 기간이나 가중치가 동적으로 바뀌거나 데이터가 매우 많다면, 가중치 테이블을 별도로 관리하거나 다른 방식으로 일반화하는 것이 유지보수와 재사용성 측면에서 더 유리할 수 있습니다.

참고로 기존 답변에서는 LAG()를 활용한 가중이동평균 방식과 SQL 및 Pandas의 활용 차이, 그리고 LAG()의 offset은 변수처럼 동적으로 지정할 수 없다는 점을 설명하고 있습니다.

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

실습 데이터(PostgreSQL 백업 파일) 관련하여 문의드립니다. (Hive 환경 실습)

0

57

2

"주문별 고객별 연관 상품 추출 SQL로 구하기-02" 수업 질문

0

98

2

쿼리 질문있습니다!!

0

85

2

없는강의요청해도됩니까,,

0

135

2

아래와 동일한 질문에 대한 추가질문입니다

0

120

2

cnt/max로 구한 결과의 차이

0

151

2

쿼리에 대한 질문이 있습니다.

0

147

2

퍼널 질문드립니다.

0

141

1

ADSP자격증

0

326

2

특정 스키마에서 생성한 편집기의 쿼리를 판다스에 삽입하는 방법

0

181

1

백업파일 테이블 생성 오류

0

272

1

"사용자별 특정 상품 주문시 함께 가장 많이 주문된 다른 상품 추출하기"에서 조건관련..

0

195

1

Plotly을 이용해 treemap시각화시 공유사항

0

323

2

월단위 카테고리별 매출액과 주문건수 및 전체매출액 대비 비율 sql로 구하기 수업 중 질문이 있습니다.

0

274

1

with 절 질문

0

275

1

데이터 분석 SQL Fundamentals 강의 할인 문의

0

232

1

리텐션 구하는 방법 문의

0

239

1

캐글데이터 Postgresql 사용

0

388

2

mau 구할때 group by 사용안해도 count 집계함수가 왜 가능한지 모르겠습니다.

0

300

1

매출분석 1에서 partition by와 group by의 차이

0

394

1

postgres 설치 오류

0

347

1

맥 계정에서 postgres 접속 시 비밀번호 입력 실패현상

1

586

2

pandas 연계시 오류.....

0

1329

3

시각화 그래프가 안보여요

0

329

1