为特定星期几或日期范围创建的累计平均记录数

时间:2009-11-30 06:20:39

标签: sql mysql statistics

是的,所以我正在填写新客户项目的需求文档,他们要求根据我们数据库中的现有数据计算增长趋势和绩效预期。

这样的事情的最佳数据来源是我们的日志表,因为我们几乎记录了我们的应用程序中发生的每一个事务。

现在,问题是,在整理累积金额和运行平均值时,我对MySql没有太多经验。我把以下查询放在一起对我来说哪个有意义,但它只是一直锁定命令控制台。这件事需要永远执行,测试样本中只有80k记录。

因此,给定以下基本表结构:

id   | action | date_created
1    | 'merp' | 2007-06-20 17:17:00
2    | 'foo'  | 2007-06-21 09:54:48
3    | 'bar'  | 2007-06-21 12:47:30
... thousands of records ...
3545 | 'stab' | 2007-07-05 11:28:36

我如何计算为一周中每个特定日期创建的平均记录数?

day_of_week | average_records_created
1           | 234
2           | 23
3           | 5
4           | 67
5           | 234
6           | 12
7           | 36

我有以下查询,这让我想通过将我的身体放在电梯井下来谋杀自己,然后放到一些子弹上:

SELECT
    DISTINCT(DAYOFWEEK(DATE(t1.datetime_entry))) AS t1.day_of_week,
    AVG((SELECT COUNT(*) FROM VMS_LOGS t2 WHERE DAYOFWEEK(DATE(t2.date_time_entry)) = t1.day_of_week)) AS average_records_created
FROM VMS_LOGS t1
GROUP BY t1.day_of_week;

HALPS?拜托,不要让我再次削减自己。 :'(

3 个答案:

答案 0 :(得分:1)

我将您的查询重写为:

  SELECT x.day_of_week,
         AVG(x.count) 'average_records_created'
    FROM (SELECT DAYOFWEEK(t.datetime_entry) 'day_of_week',
                 COUNT(*) 'count'
            FROM VMS_LOGS t
        GROUP BY DAYOFWEEK(t.datetime_entry)) x
GROUP BY x.day_of_week

答案 1 :(得分:1)

您的查询花费这么长时间的原因是因为您的内部选择,您必须运行6,400,000,000个查询。通过这样的查询,您最好的解决方案可能是开发一个定时报告系统,用户在查询完成后收到电子邮件并构建报告或用户登录并在之后检查报告。

即使使用OMG Ponies(下图)编写的优化,您仍然会查看相同数量的查询。

  SELECT x.day_of_week,
         AVG(x.count) 'average_records_created'
    FROM (SELECT DAYOFWEEK(t.datetime_entry) 'day_of_week',
                 COUNT(*) 'count'
            FROM VMS_LOGS t
        GROUP BY DAYOFWEEK(t.datetime_entry)) x
  GROUP BY x.day_of_week

答案 2 :(得分:1)

在对此信息进行采样时,您需要走多远?只要不到一年,这个解决方案就可以运行。

因为星期几和星期数对于记录是常量,所以创建一个具有ID,WeekNumber和DayOfWeek的伴随表。每当您想要运行此统计信息时,只需从主表中生成“缺失”记录。

然后,您的报告可以是:

select
  DayOfWeek
, count(*)/count(distinct(WeekNumber)) as Average
from
  MyCompanionTable
group by
  DayOfWeek

当然,如果表太大,那么您可以每天预先汇总数据并使用它,并在运行报告时从主表中添加“今天”数据。