【Leetcode】高频SQL基础题--1321.餐馆营业额变化增长
【Leetcode】高频SQL基础题–1321.餐馆营业额变化增长
要求:你是餐馆的老板,现在你想分析一下可能的营业额变化增长(每天至少有一位顾客)。
计算以 7 天(某日期 + 该日期前的 6 天)为一个时间段的顾客消费平均值。average_amount 要 保留两位小数。
结果按 visited_on 升序排序。
解题思路:
1、先将原始数据按日期分组,计算每天的总消费额,即 生成一个临时表 daily_sums,包含两列:visited_on(日期)和 daily_amount(该日总消费)
2、然后使用窗口函数计算每个日期的 7 天移动总消费和移动窗口内的天数计数,即 生成一个临时表 windowed,包含三列:visited_on(日期)、total_amount(7 天窗口内的总消费)、day_count(窗口内的实际天数)。
3、最后在主查询中从 windowed中过滤日期,只保留有完整 7 天数据的日期(即 day_count = 7),计算平均值并格式化输出。
4、按照按日期升序排序
代码:
# Write your MySQL query statement below
WITH daily_sums AS (SELECT visited_on,SUM(amount) AS daily_amountFROM CustomerGROUP BY visited_on
),
windowed AS (SELECTvisited_on,SUM(daily_amount) OVER (ORDER BY visited_on ROWS BETWEEN 6 PRECEDING AND CURRENT ROW) AS total_amount,COUNT(daily_amount) OVER (ORDER BY visited_on ROWS BETWEEN 6 PRECEDING AND CURRENT ROW) AS day_countFROM daily_sums
)
SELECTvisited_on,total_amount AS amount,ROUND(total_amount / 7.0, 2) AS average_amount
FROM windowed
WHERE day_count = 7
ORDER BY visited_on;
注意:
ROWS BETWEEN 6 PRECEDING AND CURRENT ROW 定义了窗口范围,确保窗口包含当前日期及前 6 天。