문제
- LeetCode SQL 문제
1321. Restaurant Growth / Medium
- 문제 내용 : [링크]
내가 작성한 Query
with temp_01 as( select visited_on , sum(amount) as amount from customer group by visited_on ), temp_02 as( select visited_on , sum(amount) over(order by visited_on rows between 6 preceding and current row) as amount , round(avg(amount) over(order by visited_on rows between 6 preceding and current row), 2) as average_amount , row_number() over() as ran from temp_01 ) select visited_on, amount, average_amount from temp_02 where ran >= 7
현재일 기준, 7일간의 매출액 amount
총 합과 7일 이동평균값을 구하는 문제이다.
우선, visited_on
데이터가 2개 이상 존재하는 일자가 있으므로,(ex. 2019-01-10에는 데이터가 2건 존재한다.)
GROUP BY
를 통해 visited_on
일자별 amount
합계를 구해준다. 이 데이터를 temp_01
으로 임시 테이블을 생성한다.
window function을 이용해 현재일 기준, 7일간 매출액합과 이동평균을 구해준다. 먼저 rows between 6 preceding and current row
를 통해 7일간의 데이터 window size를 설정해준다. order by
를 통해 일자별로 합계와 평균값이 집계되도록 한다.
평균이 경우, round
함수를 통해 소수 둘째 자리까지 출력해준다.
이후, row_number()
를 통해 visited_on
순서대로 일자별 번호(ran
)를 매겨준다.
⭐ 왜 번호를 매겨주나??? : 현재일 기준 이전 6일치의 데이터가 없는 일자는 제외하고 데이터를 출력해야한다. 따라서 ran >=7
을 이용해 7일치의 데이터가 없는 일자를 제거해주려고 한다.
위에서 구한 데이터들을 temp_02
로 임시 테이블 생성한다.
visited_on
, amount
, average_amount
를 출력해주되
WHERE
절 조건을 통해 ran
이 7 이상인 데이터만 필터링해준다.
(6일차 까지의 데이터는 제거)
⭐⭐⭐ MA 구하는 유형의 문제 window function 활용+ 이전 6일간의 데이터를 필터링 할 때, row_number()
를 활용할 수 있다. 복습 필!