1321. Restaurant Growth(LeetCode)

minllny·2024년 5월 9일

제 답 쿼리입니다.

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()를 사용하였을 때 발생할 수 있는 오류를 잘 캐치하였습니다.

profile
SQL 끄적끄적

0개의 댓글