【问题标题】:How to find daily average over a time period in mysql?如何在mysql中找到一段时间内的每日平均值?
【发布时间】:2013-02-18 16:00:52
【问题描述】:

我有一个有两列的表格:

标记

CREAT_TS

我想计算两个日期范围(例如 startDate 和 endDate)之间的每日平均分数

我进行了以下查询:

select SUM(MARKS)/ COUNT(date(CREAT_TS)) AS DAILY_AVG_MARKS, 

date(CREAT_TS) AS DATE 

from TABLENAME

group by date(CREAT_TS)

通过这个查询,只有当数据库中有一行对应的日期时,我才能获得每日平均值。但我的要求是,即使没有行,我也想在那个日期显示 0。 我的意思是,如果 (startDate, endDate) 之间有 X 天,我希望查询返回 X 行

谁能帮帮我。 :(

【问题讨论】:

  • 你如何定义startDateendDate?它们是参数,creat_ts 的 MIN 和 MAX,还是其他?
  • 您可能想要构建一个日历表,然后执行一个OUTER JOIN。见brianshowalter.com/calendar_tables
  • 请注意,AVG(MARKS) 也可以正常工作
  • @PM77-1,它们可以是任何时间戳。

标签: mysql sql database


【解决方案1】:

您需要创建一组可以添加到日期的整数。下面给你一个思路:

select thedate, avg(Marks) as DAILY_AVG_MARKS
from (select startdate+ interval num day as thedate
      from (select d1.d + 10 * d2.d + 100*d3.d as num
            from (select 0 as d union select 1 union select 2 union select 3 union select 4 union
                  select 5 union select 6 union select 7 union select 8 union select 9
                 ) d1 cross join
                 (select 0 as d union select 1 union select 2 union select 3 union select 4 union
                  select 5 union select 6 union select 7 union select 8 union select 9
                 ) d2 cross join
                 (select 0 as d union select 1 union select 2 union select 3 union select 4 union
                  select 5 union select 6 union select 7 union select 8 union select 9
                 ) d3
            ) n cross join
            (select XXX as startdate, YYY as enddate) const
       where startdate + num <= enddate
      ) left outer join
      tablename t
      on date(CREAT_TS) = thedate
group by thedate

所有的复杂性在于为报告创建一组连续日期。如果你有一个numbers 表或calendar 表,那么SQL 看起来要简单得多。

这是如何工作的?第一个大子查询有两个部分。第一个只是通过交叉连接数字 0-9 并做一些算术来生成从 0 到 999 的数字。第二个将其连接到两个日期,startdateenddate——您需要为 XXX 和 YYY 输入正确的值。使用此表,您可以获得两个值之间的所有日期。如果您需要超过 999 天,只需添加另一个交叉连接即可。

这是左连接到您的数据表。结果是分组依据的所有日期都出现了。

在报告方面,在表示层执行此操作有利有弊。基本上,在 SQL 中执行此操作的优点是报表层更简单。在报告层这样做的好处是 SQL 更简单。外人很难做出这样的判断。

我的建议是创建一个可以在这样的报告中使用的数字表。然后查询将看起来更简单,您不必更改报告层。

【讨论】:

  • 数字表或日历表是什么意思? creat_ts 列的数据类型?
  • 请避免使用嵌套查询。
  • @hilarudeens 。 . .你不应该在没有支持的情况下发表这种无意义的言论。
  • @hilarudeens 。 . .子查询没有错。它们是 SQL 语言中非常重要的一部分。如果您学到了其他知识,那么您需要了解有关数据库的更多信息。我想我的反应部分是因为有人会因为错误信息而对基本正确的答案投反对票。
  • 当我在做的时候,我做了一个working example on SQL Fiddle。为了表明这是正确的做法(如果不使用永久日历表)
猜你喜欢
  • 1970-01-01
  • 2021-08-22
  • 1970-01-01
  • 2020-03-02
  • 1970-01-01
  • 2021-08-05
  • 1970-01-01
  • 2015-02-08
  • 1970-01-01
相关资源
最近更新 更多