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;

浙公网安备 33010602011771号