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號