오랑우탄의 반란

LeetCode 리트코드 | 1321. Restaurant Growth (MySQL) 본문

SQL/LeetCode

LeetCode 리트코드 | 1321. Restaurant Growth (MySQL)

5&2 2024. 8. 5. 13:39
반응형


오늘도 오랑이는 
문제를 풉니다.

 

1321. Restaurant Growth

 

풀이 과정

주어진 날짜 중 7일에 대한 합과 평균을 구해야 하는 문제입니다. 

윈도우 함수를 사용해 범위를 지정해서 특정 날짜 구간에 대해 집계를 할 수 있는데요, range로 날짜 범위를 구할 수 있습니다. 이때 interval 은 datatype 이 date 인 경우에만 사용 가능하다는 점을 주의해야 합니다. 

sum(amount) over (order by visited_on range between interval '6' day preceding and current row) as amount

 

해당 조건을 from 서브쿼리로 넣어주면 7일에 대한 합과 평균을 구할 수 있습니다. 이때 행이 중복으로 들어가지 않게 group by 로 묶어줍니다. 

select visited_on, amount, round(amount/7,2) as average_amount
from (
    select visited_on, 
            sum(amount) over (order by visited_on range between interval '6' day preceding and current row) as amount
    from customer
) a

 

마지막으로 visited_on 의 범위를 지정해줘야 하는데요, 가장 간단하게는 where 조건에 서브쿼리로 조건을 바로 달아주는 것입니다. visited_on 의 최소값에서 6을 더한 일수, 즉 7일째보다 크거나 같은 visited_on 에 대해서만 출력해달라는 뜻입니다. 

where visited_on >= (select min(visited_on) + interval 6 day from customer)

 

이 조건을 위에서 작성한 서브쿼리 안에 넣어줄 수도 있습니다.

min(visited_on) over() 로 작성하면 first_date 라는 칼럼이 생성되며 매 행마다 visited_on 중 최소값이 들어갑니다. 

이 행의 결과를 중심으로 + 6일인 visited_on 만 출력하도록 where 조건을 붙여줄 수 있습니다. 

from (
    select distinct visited_on, 
            sum(amount) over (order by visited_on range between interval '6' day preceding and current row) as amount,
            min(visited_on) over() as first_date
    from customer
) a
where visited_on >= first_date + 6

 

 

최종 코드

# 풀이 1
select visited_on, amount, round(amount/7,2) as average_amount
from (
    select visited_on, 
            sum(amount) over (order by visited_on range between interval '6' day preceding and current row) as amount
    from customer
) a
where visited_on >= (select min(visited_on) + interval 6 day from customer)


# 풀이 2
select visited_on, amount, round(amount/7,2) as average_amount
from (
    select distinct visited_on, 
            sum(amount) over (order by visited_on range between interval '6' day preceding and current row) as amount,
            min(visited_on) over() as first_date
    from customer
) a
where visited_on >= first_date + 6

 

 

 


오랑우탄이 영어를 하고 오랑이가 쿼리마스터가 되는 그날까지~

 

 

https://leetcode.com/problems/restaurant-growth/

 

 

반응형