Table: Customer
+---------------+---------+
| Column Name | Type |
+---------------+---------+
| customer_id | int |
| name | varchar |
| visited_on | date |
| amount | int |
+---------------+---------+
In SQL,(customer_id, visited_on) is the primary key for this table.
This table contains data about customer transactions in a restaurant.
visited_on is the date on which the customer with ID (customer_id) has visited the restaurant.
amount is the total paid by a customer.
You are the restaurant owner and you want to analyze a possible expansion (there will be at least one customer every day).
Compute the moving average of how much the customer paid in a seven days window (i.e., current day + 6 days before). average_amount should be rounded to two decimal places.
Return the result table ordered by visited_on in ascending order.
The result format is in the following example.
Example 1:
Input:
Customer table:
+-------------+--------------+--------------+-------------+
| customer_id | name | visited_on | amount |
+-------------+--------------+--------------+-------------+
| 1 | Jhon | 2019-01-01 | 100 |
| 2 | Daniel | 2019-01-02 | 110 |
| 3 | Jade | 2019-01-03 | 120 |
| 4 | Khaled | 2019-01-04 | 130 |
| 5 | Winston | 2019-01-05 | 110 |
| 6 | Elvis | 2019-01-06 | 140 |
| 7 | Anna | 2019-01-07 | 150 |
| 8 | Maria | 2019-01-08 | 80 |
| 9 | Jaze | 2019-01-09 | 110 |
| 1 | Jhon | 2019-01-10 | 130 |
| 3 | Jade | 2019-01-10 | 150 |
+-------------+--------------+--------------+-------------+
Output:
+--------------+--------------+----------------+
| visited_on | amount | average_amount |
+--------------+--------------+----------------+
| 2019-01-07 | 860 | 122.86 |
| 2019-01-08 | 840 | 120 |
| 2019-01-09 | 840 | 120 |
| 2019-01-10 | 1000 | 142.86 |
+--------------+--------------+----------------+
Explanation:
1st moving average from 2019-01-01 to 2019-01-07 has an average_amount of (100 + 110 + 120 + 130 + 110 + 140 + 150)/7 = 122.86
2nd moving average from 2019-01-02 to 2019-01-08 has an average_amount of (110 + 120 + 130 + 110 + 140 + 150 + 80)/7 = 120
3rd moving average from 2019-01-03 to 2019-01-09 has an average_amount of (120 + 130 + 110 + 140 + 150 + 80 + 110)/7 = 120
4th moving average from 2019-01-04 to 2019-01-10 has an average_amount of (130 + 110 + 140 + 150 + 80 + 110 + 130 + 150)/7 = 142.86
# 1. 날짜별로 amount의 총량 구하기
WITH base AS (
SELECT
visited_on,
SUM(amount) AS amount
FROM customer
GROUP BY
visited_on
)
SELECT
visited_on,
amount,
average_amount
FROM (
SELECT
visited_on,
# 2. 6일 전의 날짜(7일차부터 가져와야 하기 때문)
LAG(visited_on, 6) OVER(ORDER BY visited_on) AS grp_day,
# 3. 6행 위부터 본인 행까지의 총합
SUM(amount) OVER(ORDER BY visited_on ROWS BETWEEN 6 PRECEDING AND CURRENT ROW) AS amount,
# 4. 6행 위부터 본인 행까지의 평균(반올림)
ROUND(AVG(amount) OVER(ORDER BY visited_on ROWS BETWEEN 6 PRECEDING AND CURRENT ROW), 2) AS average_amount
FROM base
) AS a
# 5. 7일차부터 출력하기 위함
WHERE
grp_day IS NOT NULL
# 6. 정렬
ORDER BY
visited_on
'[SQL]' 카테고리의 다른 글
LeetCode 코딩 테스트 - Immediate Food Delivery II(LV.Medium) (0) | 2025.03.15 |
---|---|
LeetCode 코딩 테스트 - Department Highest Salary(LV.Medium) (0) | 2025.03.15 |
LeetCode 코딩 테스트 - Product Price at a Given Date(LV.Medium) (0) | 2025.03.12 |
LeetCode 코딩 테스트 - Market Analysis I(LV.Medium) (0) | 2025.03.11 |
LeetCode 코딩 테스트 - Monthly Transactions I(LV.Medium) (0) | 2025.03.10 |