
제 답 쿼리입니다.
WITH T AS (
SELECT customer_id
, name
, visited_on
, SUM(amount) amount
, DENSE_RANK() OVER (ORDER BY visited_on) day_rank
FROM Customer
GROUP BY visited_on
)
SELECT visited_on
, (SELECT SUM(amount) FROM T T2 WHERE T2.visited_on BETWEEN DATE_SUB(T1.visited_on, INTERVAL 6 DAY) AND T1.visited_on) amount
, ROUND((SELECT AVG(amount) FROM T T2 WHERE T2.visited_on BETWEEN DATE_SUB(T1.visited_on, INTERVAL 6 DAY) AND T1.visited_on), 2) average_amount
FROM T T1
WHERE day_rank >= 7
서브쿼리가 3개나 있어요오
런타임도 나쁘지 않았는데 다른 사람의 답도 봐봅시다 !!
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
)
GROUP BY visited_on;
굉장히 깔끔하네요!! WHERE절에서 서브쿼리를 사용하여 7번째 날짜부터 출력되도록 해주었습니다!
또 저는 날짜별로 그룹화하여 날짜별 amount를 먼저 계산해주었고
이 쿼리는 그 작업은 따로 하지 않고 SUM(amount) / 7 로 계산하여
AVG()를 사용하였을 때 발생할 수 있는 오류를 잘 캐치하였습니다.