|
| 1 | +-- Source: https://leetcode.com/problems/restaurant-growth/description/?envType=study-plan-v2&envId=top-sql-50 |
| 2 | + |
| 3 | +-- Table: Customer |
| 4 | + |
| 5 | +-- +---------------+---------+ |
| 6 | +-- | Column Name | Type | |
| 7 | +-- +---------------+---------+ |
| 8 | +-- | customer_id | int | |
| 9 | +-- | name | varchar | |
| 10 | +-- | visited_on | date | |
| 11 | +-- | amount | int | |
| 12 | +-- +---------------+---------+ |
| 13 | +-- In SQL,(customer_id, visited_on) is the primary key for this table. |
| 14 | +-- This table contains data about customer transactions in a restaurant. |
| 15 | +-- visited_on is the date on which the customer with ID (customer_id) has visited the restaurant. |
| 16 | +-- amount is the total paid by a customer. |
| 17 | + |
| 18 | +-- You are the restaurant owner and you want to analyze a possible expansion (there will be at least one customer every day). |
| 19 | + |
| 20 | +-- 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. |
| 21 | + |
| 22 | +-- Return the result table ordered by visited_on in ascending order. |
| 23 | + |
| 24 | +-- The result format is in the following example. |
| 25 | + |
| 26 | +-- Example 1: |
| 27 | + |
| 28 | +-- Input: |
| 29 | +-- Customer table: |
| 30 | +-- +-------------+--------------+--------------+-------------+ |
| 31 | +-- | customer_id | name | visited_on | amount | |
| 32 | +-- +-------------+--------------+--------------+-------------+ |
| 33 | +-- | 1 | Jhon | 2019-01-01 | 100 | |
| 34 | +-- | 2 | Daniel | 2019-01-02 | 110 | |
| 35 | +-- | 3 | Jade | 2019-01-03 | 120 | |
| 36 | +-- | 4 | Khaled | 2019-01-04 | 130 | |
| 37 | +-- | 5 | Winston | 2019-01-05 | 110 | |
| 38 | +-- | 6 | Elvis | 2019-01-06 | 140 | |
| 39 | +-- | 7 | Anna | 2019-01-07 | 150 | |
| 40 | +-- | 8 | Maria | 2019-01-08 | 80 | |
| 41 | +-- | 9 | Jaze | 2019-01-09 | 110 | |
| 42 | +-- | 1 | Jhon | 2019-01-10 | 130 | |
| 43 | +-- | 3 | Jade | 2019-01-10 | 150 | |
| 44 | +-- +-------------+--------------+--------------+-------------+ |
| 45 | +-- Output: |
| 46 | +-- +--------------+--------------+----------------+ |
| 47 | +-- | visited_on | amount | average_amount | |
| 48 | +-- +--------------+--------------+----------------+ |
| 49 | +-- | 2019-01-07 | 860 | 122.86 | |
| 50 | +-- | 2019-01-08 | 840 | 120 | |
| 51 | +-- | 2019-01-09 | 840 | 120 | |
| 52 | +-- | 2019-01-10 | 1000 | 142.86 | |
| 53 | +-- +--------------+--------------+----------------+ |
| 54 | +-- Explanation: |
| 55 | +-- 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 |
| 56 | +-- 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 |
| 57 | +-- 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 |
| 58 | +-- 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 |
| 59 | + |
| 60 | +------------------------------------------------------------------------------ |
| 61 | + |
| 62 | +-- SQL Schema |
| 63 | + |
| 64 | +Create table If Not Exists Customer (customer_id int, name varchar(20), visited_on date, amount int) |
| 65 | +Truncate table Customer |
| 66 | +insert into Customer (customer_id, name, visited_on, amount) values ('1', 'Jhon', '2019-01-01', '100') |
| 67 | +insert into Customer (customer_id, name, visited_on, amount) values ('2', 'Daniel', '2019-01-02', '110') |
| 68 | +insert into Customer (customer_id, name, visited_on, amount) values ('3', 'Jade', '2019-01-03', '120') |
| 69 | +insert into Customer (customer_id, name, visited_on, amount) values ('4', 'Khaled', '2019-01-04', '130') |
| 70 | +insert into Customer (customer_id, name, visited_on, amount) values ('5', 'Winston', '2019-01-05', '110') |
| 71 | +insert into Customer (customer_id, name, visited_on, amount) values ('6', 'Elvis', '2019-01-06', '140') |
| 72 | +insert into Customer (customer_id, name, visited_on, amount) values ('7', 'Anna', '2019-01-07', '150') |
| 73 | +insert into Customer (customer_id, name, visited_on, amount) values ('8', 'Maria', '2019-01-08', '80') |
| 74 | +insert into Customer (customer_id, name, visited_on, amount) values ('9', 'Jaze', '2019-01-09', '110') |
| 75 | +insert into Customer (customer_id, name, visited_on, amount) values ('1', 'Jhon', '2019-01-10', '130') |
| 76 | +insert into Customer (customer_id, name, visited_on, amount) values ('3', 'Jade', '2019-01-10', '150') |
| 77 | + |
| 78 | +-- MS SQL Server Code |
| 79 | + |
| 80 | +WITH |
| 81 | +amount_per_day AS ( |
| 82 | + SELECT |
| 83 | + visited_on |
| 84 | + , SUM(SUM(amount)) OVER(ORDER BY visited_on |
| 85 | + ROWS BETWEEN 6 PRECEDING AND CURRENT ROW) AS amount |
| 86 | + , ROUND(AVG(SUM(amount)*1.0) OVER(ORDER BY visited_on |
| 87 | + ROWS BETWEEN 6 PRECEDING AND CURRENT ROW),2) AS average_amount |
| 88 | + FROM Customer |
| 89 | + GROUP BY visited_on |
| 90 | +), |
| 91 | +starting_date AS ( |
| 92 | + SELECT DATEADD(day, 6, earliest_date) AS starting_date |
| 93 | + FROM |
| 94 | + ( SELECT MIN(visited_on) AS earliest_date |
| 95 | + FROM amount_per_day |
| 96 | + ) AS a |
| 97 | +) |
| 98 | + |
| 99 | +SELECT visited_on, amount, average_amount |
| 100 | +FROM amount_per_day |
| 101 | +CROSS JOIN starting_date |
| 102 | +WHERE visited_on >= starting_date |
| 103 | +ORDER BY visited_on; |
0 commit comments