首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >MySQL,获取一周内所有日期的平均值

MySQL,获取一周内所有日期的平均值
EN

Stack Overflow用户
提问于 2018-07-15 22:59:55
回答 1查看 649关注 0票数 1

我有一个表,其中包含每小时存储的数据,我所在位置的位置不可用或空闲。我当前的查询获取全天的平均占用率/空闲区:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
SELECT AVG(sz.occupied), AVG(sz.free)
FROM `hourly_cache` AS sz
WHERE   sz.time BETWEEN '2017-01-01 00:00:00' AND '2017-01-02 00:00:00'
        AND HOUR(sz.time) BETWEEN 8 AND 22
        AND libID = 0

但是,如果我想要的不只是这一天的平均值,而是一周中每隔一天的平均值呢?例如:我想要本周周一的平均值,加上周二、周三等。

如何循环遍历每一天,并在每一天根据日期运行此查询?

我正在考虑用PHP语言来实现,但是想知道是否有一种方法可以在MySQL中工作?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-07-15 23:17:07

可能会有太多的解决方案,这取决于业务逻辑和您希望呈现它的方式。

1)将time字段分配给datetime,然后按date分组

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
SELECT AVG(sz.occupied), AVG(sz.free), date, time
FROM `hourly_cache` AS sz
WHERE   
  (sz.date >= '2017-01-01' AND sz.date < '2017-01-07')
  AND HOUR(sz.time) BETWEEN 8 AND 22
  AND libID = 0
GROUP BY date;

2)将时间转换为日期,并按日期分组:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
SELECT AVG(sz.occupied), AVG(sz.free), DATE(sz.time) as date
FROM `hourly_cache` AS sz
WHERE   
  (sz.time >= '2017-01-01 00:00:00' AND sz.time < '2017-01-07 00:00:00')
  AND HOUR(sz.time) BETWEEN 8 AND 22
  AND libID = 0
GROUP BY date;

3)使用DAYOFWEEK函数

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
SELECT AVG(sz.occupied), AVG(sz.free), DAYOFWEEK(sz.time) as day_of_week
FROM `hourly_cache` AS sz
WHERE   
  (sz.time >= '2017-01-01 00:00:00' AND sz.time < '2017-01-07 00:00:00')
  AND HOUR(sz.time) BETWEEN 8 AND 22
  AND libID = 0
GROUP BY day_of_week;

4)将day_of_weekweek_num字段添加到hourly_cache表中,在插入或更新时设置。

然后按如下方式查询:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
SELECT AVG(sz.occupied), AVG(sz.free), week_num, day_of_week
FROM `hourly_cache` AS sz
WHERE   
  (sz.time >= '2017-01-01 00:00:00' AND sz.time < '2017-01-07 00:00:00')
  AND HOUR(sz.time) BETWEEN 8 AND 22
  AND libID = 0
GROUP BY week_num, day_of_week;

5)如果你不能改变表结构,你可以创建一个视图(但我不确定性能):

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
CREATE VIEW v_avarage_seats_by_date AS 
  SELECT 
    AVG(sz.occupied) as occupied, 
    AVG(sz.free) as free, 
    DATE(sz.time) as date,
    DAYOFWEEK(sz.time) as day_of_week
  FROM `hourly_cache` AS sz
  WHERE   
    (HOUR(sz.time) BETWEEN 8 AND 22) AND libID = 0
  GROUP BY date;

然后按如下方式查询:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
SELECT * FROM v_avarage_seats_by_date WHERE date >= '2017-01-01' AND date =< '2017-01-07'
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51352827

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文