1321 餐馆营业额变化增长

1321 餐馆营业额变化增长

1321. 餐馆营业额变化增长

本题考察某一段时间数据总值以及平均值,该题我使用窗口函数解答

第一步 同一时间统计并去重

首先我们得出每一个时间的总值,方便后续统计

group by可以得出对字段去重

假设该查询后的表为tmp0

# tmp0
select visited_on, sum(amount) as sum_amount
from Customer
group by visited_on

第二步 统计规定时间内的营业额

接着统计7天内的营业额

函数介绍to_days

  • 计算日期 d 距离 0000 年 1 月 1 日的天数
  • SELECT TO_DAYS('0001-01-01 01:01:01') -> 366

窗口的滑动范围:

  • 当前行 - current row
  • 之前的行 - preceding
  • 之后的行 - following
  • 无界限 - unbounded
  • 表示从前面的起点 - unbounded preceding
  • 表示到后面的终点 - unbounded following

因此可以的到窗口函数over (order by to_days(visited_on) range between 6 preceding and current row)

假设该查询后的表为tmp1

# tmp1
select visited_on, 
sum(sum_amount) 
over (order by to_days(visited_on) range between 6 preceding and current row) as sum_amount
from tmp0

第三步 计算平均值

使用聚合函数round得出计算平均数后取两位小数

select visited_on, sum_amount as amount, 
        round(sum_amount / 7, 2) as average_amount
from tmp1

第四步 计算相差天数

函数介绍DATEDIFF

  • 计算日期 d1->d2 之间相隔的天数
  • SELECT DATEDIFF('2001-01-01','2001-01-04') -> -3

由于我们计算7天的营业额是按照:某日期 + 该日期前的6天计算,因此有:

DATEDIFF(visited_on, (select min(visited_on)
from Customer)) >= 6

最终结果

最后的SQL查询语句为:

select visited_on, sum_amount as amount, 
        round(sum_amount / 7, 2) as average_amount
from (
    select visited_on, 
sum(sum_amount) 
over (order by to_days(visited_on) range between 6 preceding and current row) as sum_amount
from (
    select visited_on, sum(amount) as sum_amount
    from Customer
    group by visited_on
    ) tmp1
) tmp2
where DATEDIFF(visited_on, (select min(visited_on)
from Customer)) >= 6;
posted @ 2025-09-29 11:30  Lantz12  阅读(12)  评论(0)    收藏  举报