举例:
今天是9-4日,需要返回
8-30 、 平均价格,
8-25、平均价格,
8-20、平均价格,
这里8-30显示的平均值,对应的是8-30到9-3共5天的价格平均值
这里8-25显示的平均值,对应的是8-25到8-29共5天的价格平均值
SQL基础薄弱,哪位同学来挑战一下
最简单的方式就是用(当前时间 - 目标时间 ) / 5,然后向上取整,这样就把时间分成了每5天一段,同一段内的编号interval_5_day_cnt
是一致。
然后按各段的编号取均值,可以计算出来每段的平均值。
最后根据段编号可以反推出来当前段的起始日期
select DATE_sub(CURDATE(),INTERVAL interval_5_day_cnt*5 day) as gmt_begin,avg_price
from
(
select ceil(DATEDIFF(CURDATE(),gmt)/5) as interval_5_day_cnt,avg(price) as avg_price
from test
group by ceil(DATEDIFF(CURDATE(),gmt)/5)
) t
;
如果少一天就除几天的
select AVG(price) from test_price where CURDATE()<=gmt and gmt<=DATE_ADD(CURDATE(), INTERVAL 4 DAY)
CTE递归实现每次减少5天查询该时间段的数据,然后以深度作为group key计算平均值
WITH RECURSIVE CTE(`start`, `end`, `depth`) AS (
SELECT DATE_ADD(CURRENT_DATE(), INTERVAL -5 DAY), DATE_ADD(CURRENT_DATE(), INTERVAL -1 DAY), 1 UNION ALL
SELECT DATE_ADD(`start`, INTERVAL -5 DAY), DATE_ADD(`start`, INTERVAL -1 DAY), `depth` + 1 FROM CTE WHERE `depth` < 3
) SELECT * FROM CTE
每5天的分组
SELECT MAX(gmt) as 时间,AVG(price) as 每组平均数 FROM 表名 group by floor(DAY( gmt)/ 5) * 10
如果是算从当天起的那一天算起算5天的话
那就用时间差来除以5
那就是
SELECT MAX(gmt) as 时间,AVG(price) as 每组平均数 FROM 表名 group by floor(DATEDIFF(CURDATE(),gmt)/ 5) * 10