LeetCode--1321. 餐馆营业额变化增长

143 阅读4分钟

1 题目描述

表: Customer

+---------------+---------+
| Column Name   | Type    |
+---------------+---------+
| customer_id   | int     |
| name          | varchar |
| visited_on    | date    |
| amount        | int     |
+---------------+---------+

在 SQL 中,(customer_id, visited_on) 是该表的主键。 该表包含一家餐馆的顾客交易数据。 visited_on 表示 (customer_id) 的顾客在 visited_on 那天访问了餐馆。 amount 是一个顾客某一天的消费总额。

你是餐馆的老板,现在你想分析一下可能的营业额变化增长(每天至少有一位顾客)。

计算以 7 天(某日期 + 该日期前的 6 天)为一个时间段的顾客消费平均值。average_amount 要 保留两位小数。 结果按 visited_on 升序排序

2 测试用例

输入:

Customer 表:

+-------------+--------------+--------------+-------------+
| 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         | 
+-------------+--------------+--------------+-------------+

输出:

+--------------+--------------+----------------+
| 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         |
+--------------+--------------+----------------+

解释:

  • 第一个七天消费平均值从 2019-01-01 到 2019-01-07 是restaurant-growth/restaurant-growth/ (100 + 110 + 120 + 130 + 110 + 140 + 150)/7 = 122.86
  • 第二个七天消费平均值从 2019-01-02 到 2019-01-08 是 (110 + 120 + 130 + 110 + 140 + 150 + 80)/7 = 120
  • 第三个七天消费平均值从 2019-01-03 到 2019-01-09 是 (120 + 130 + 110 + 140 + 150 + 80 + 110)/7 = 120
  • 第四个七天消费平均值从 2019-01-04 到 2019-01-10 是 (130 + 110 + 140 + 150 + 80 + 110 + 130 + 150)/7 = 142.86

3 解题思路

  1. visited_on按照升序,计算当前日期和前6天的消费额的总和sum(amount) over (order by visited_on range between interval 6 day preceding and current row),窗口函数使用介绍:MySQL窗口函数
select visited_on,  
       sum(amount) over (order by visited_on range between interval 6 day preceding and current row) as amount  
from Customer

执行结果

+----------+------+
|visited_on|amount|
+----------+------+
|2019-01-01|100   |
|2019-01-02|210   |
|2019-01-03|330   |
|2019-01-04|460   |
|2019-01-05|570   |
|2019-01-06|710   |
|2019-01-07|860   |
|2019-01-08|840   |
|2019-01-09|840   |
|2019-01-10|1000  |
|2019-01-10|1000  |
+----------+------+
  1. 按照题目要求需要计算7天平均消费额,需要找出符合7天消费额总和的数据,转换思路:先找出最小日期,只要当前日期 - 最小日期 >= 6就是符合要求的,使用时间函数DATEDIFF(),使用介绍:MySQL日期函数
select *  
from (select visited_on,  
             sum(amount) over (order by visited_on range between interval 6 day preceding and current row) as amount  
      from Customer) as c  
where DATEDIFF(c.visited_on, (select min(visited_on) from Customer)) >= 6;

执行结果

+----------+------+
|visited_on|amount|
+----------+------+
|2019-01-07|860   |
|2019-01-08|840   |
|2019-01-09|840   |
|2019-01-10|1000  |
|2019-01-10|1000  |
+----------+------+
  1. 计算7天平均消费额,保留两位小数,需要注意同一天存在多条记录,需要去重
select distinct visited_on, amount, round(amount / 7, 2) as average_amount  
from (select visited_on,  
             sum(amount) over (order by visited_on range between interval 6 day preceding and current row) as amount  
      from Customer) as c  
where DATEDIFF(c.visited_on, (select min(visited_on) from Customer)) >= 6;

执行结果

+----------+------+--------------+
|visited_on|amount|average_amount|
+----------+------+--------------+
|2019-01-07|860   |122.86        |
|2019-01-08|840   |120.00        |
|2019-01-09|840   |120.00        |
|2019-01-10|1000  |142.86        |
+----------+------+--------------+