inflearn logo
강의

Khóa học

Chia sẻ kiến thức

Phân tích dữ liệu SQL được học qua nhiều ví dụ khác nhau

Tính doanh số trung bình di chuyển có trọng số bằng cách sử dụng SQL

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

4

sukang73

2 câu hỏi đã được viết

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

Câu trả lời 1

0

communityai8509

안녕하세요, 인프런 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

100

2

쿼리 질문있습니다!!

0

87

2

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

0

135

2

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

0

122

2

cnt/max로 구한 결과의 차이

0

154

2

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

0

150

2

퍼널 질문드립니다.

0

144

1

ADSP자격증

0

328

2

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

0

183

1

백업파일 테이블 생성 오류

0

273

1

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

0

197

1

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

0

326

2

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

0

277

1

with 절 질문

0

277

1

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

0

234

1

리텐션 구하는 방법 문의

0

241

1

캐글데이터 Postgresql 사용

0

390

2

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

0

302

1

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

0

395

1

postgres 설치 오류

0

347

1

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

1

586

2

pandas 연계시 오류.....

0

1329

3

시각화 그래프가 안보여요

0

329

1