카테고리 없음

[LeetCode] restaurant-growth 📌

응엉잉 2024. 3. 26. 01:31

https://leetcode.com/problems/restaurant-growth/?envType=study-plan-v2&envId=top-sql-50

 

날짜별 이동합과 이동평균을 구하는게 어려웟던 문제

 

1. 날짜를 만들어주고

2. 이동합을 구해주고

3. 이동평균을 구해주는 식으로 문제를 풀어야 한다

 

1. 날짜 만들어주기

SELECT visited_on
FROM customer c
WHERE visited_on >= (SELECT DATE_ADD(MIN(visited_on),INTERVAL 6 DAY) FROM customer)
GROUP BY visited_on

WHERE절 서브쿼리DATE_ADD(날짜, INTERVAL n DAY) 함수를 사용해서

테이블 내의 최소일자 + 6일 이상 인 날짜들에 대해서만 출력했다

 

2. 이동합 만들어주기

SELECT visited_on,
(
    SELECT SUM(amount)
    FROM customers
    WHERE visited_on BETWEEN DATE_SUB(c.visited_on, INTERVAL 6 DAY) AND c.visited_on
) AS amount
FROM customer c
WHERE ... (1번쿼리)

SELECT절에 서브쿼리를 만들줬다.

이때 visited_on의 범위 설정을 위해 BETWEENDATE_SUB를 사용해주었다.

visited_on에 대해 GROUP BY를 하니까 자동으로 쪼개진다.

 

3. 이동평균 만들어주기

2번 쿼리와 유사하다

# Write your MySQL query statement below
SELECT visited_on, -- 날짜
    (SELECT SUM(amount)
    FROM customer
    WHERE visited_on BETWEEN DATE_SUB(c.visited_on, INTERVAL 6 DAY)
        AND c.visited_on) AS amount, -- 이동합
    ROUND((SELECT SUM(amount) / 7
    FROM customer
    WHERE visited_on BETWEEN DATE_SUB(c.visited_on, INTERVAL 6 DAY)
        AND c.visited_on),2) AS average_amount -- 이동평균
FROM customer c
WHERE visited_on >= (SELECT DATE_ADD(MIN(visited_on), INTERVAL 6 DAY) FROM customer) -- visited_ on >= 가장 이른 일자 + 6일
GROUP BY visited_on