03/06 SQL 문제풀이 - 1321. Restaurant Growth (Leetcode) ⭐⭐⭐

Data Architect / Engineer·2024년 3월 7일
1

1일_1SQL

목록 보기
47/63
post-thumbnail

문제

  • 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()를 활용할 수 있다. 복습 필!

profile
질문은 계속돼 아오에

0개의 댓글