오랑우탄의 반란
LeetCode 리트코드 | 1321. Restaurant Growth (MySQL) 본문
반응형
오늘도 오랑이는 문제를 풉니다.
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/
반응형
'SQL > LeetCode' 카테고리의 다른 글
LeetCode 리트코드 | 185. Department Top Three Salaries (MySQL) DENSE_RANK (0) | 2024.08.08 |
---|---|
LeetCode 리트코드 | 602. Friend Requests II: Who Has the Most Friends (MySQL) (0) | 2024.08.07 |
LeetCode 리트코드 | 1341. Movie Rating (MySQL) (0) | 2024.08.02 |
LeetCode 리트코드 | 626. Exchange Seats (MySQL) CASE, LAG/LEAD, ROW_NUMBER (0) | 2024.08.01 |
LeetCode 리트코드 | 1907. Count Salary Categories (MySQL) Union (0) | 2024.07.23 |