【问题标题】:Split months into 4 and retrieve the average value per day将月份拆分为 4 并检索每天的平均值
【发布时间】:2018-05-28 09:21:23
【问题描述】:

这是对在 MySQL 中复杂存储过程中创建的临时表的查询的输出:

现在的目标是像我们这里一样获得每天的平均持续时间,但每个月都是每周

所以我想把每个月分成 4 天,平均持续时间 每天
因此,无论一个月有多少天,我都会有4个值。

我该怎么做?

注意:如果更容易的话,我可以用 php 来做,因为我将使用这种语言的数据。

【问题讨论】:

  • 不要将您的数据作为图像发布。我们无法处理图像。创建一个 ascii 数据表(格式化文本)或进行导出并将其放在 sqlfiddle.com... 还创建一个预期的输出作为格式化文本。
  • 那么对于 2018 年 2 月的 28 天,您想要四个结果行(2 月 1 日至 7 日、2 月 8 日至 14 日、2 月 15 日至 21 日、2 月 22 日至 28 日)?但是其他月份的日子不能被 4 整除而没有余数呢?我们是否必须查看小时范围来获得相同持续时间的块?
  • @ThorstenKettner 你说得对,为了让结果更容易,像 Days1-7、Days8-14、Days15-21、Days22+ 这样的结果就足够了
  • 不要指望有人会在没有更好的数据示例和预期结果的情况下为您提供帮助(请参阅我的第一条评论)。除了 PHPMyAdmin 中的 CREATE TABLE 和 INSERT 语句导出(来自 PHPMyAdmin 的图像)真的容易做
  • duration的数据类型是什么?它永远是0吗?如果可以,应该将该值包含在平均值中还是忽略?

标签: php mysql sql date stored-procedures


【解决方案1】:

您有一个每天分组的查询,例如:

select 
  the_date as day,
  sec_to_time(avg(timestampdiff(second, start_time, end_time))) as duration
from ...
group by the_date;

您希望改为每月第 1-7、8-14、15-21、22 天结束。使用CASE WHEN 建立群组。

select 
  year(the_date) as year,
  month(the_date) as month,
  case 
    when day(the_date) <=  7 then '01-07'
    when day(the_date) <= 14 then '08-14'
    when day(the_date) <= 21 then '15-21'
    else                          '22-end'
  end as day_range,
  sec_to_time(avg(timestampdiff(second, start_time, end_time))) as duration
from ...
group by year, month, day_range
order by year, month, day_range;

【讨论】:

  • 它几乎可以工作了,谢谢!唯一剩下的问题是这条线: sec_to_time(avg(timestampdiff(second, start_time, end_time))) 这只是做平均数,但我需要对天数求和(一天有多个开始和停止)然后,一周的平均值。我将尝试从 select 中进行选择以解决此问题
  • 我在您的请求中添加了一些东西来计算总和的平均值,它运行良好,感谢您的帮助!
猜你喜欢
  • 1970-01-01
  • 2018-12-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-01-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多