【问题标题】:Select average monthly count, grouped by a field选择按字段分组的平均每月计数
【发布时间】:2014-05-26 16:59:53
【问题描述】:

我不确定以前是否有人问过这个问题,因为我不知道如何最好地表达这个问题。

给定如下查询:

SELECT DATE_FORMAT(i.created, '%Y-%m') as 'period',
COUNT(id) as 'total',
i.company_id
FROM invoice i
GROUP BY period, i.company_id
ORDER BY period DESC, total DESC

如何返回按 company_id 分组的每月平均和/或平均计数?重要的是只计算实际有发票的那些时期。

【问题讨论】:

  • 发布一些示例现有数据和预期输出。
  • 您的查询目前无法使用索引来回答GROUP BYCOUNT()(读取,在大型数据集上非常慢)。如果您有一个日历表(对于分析目的愚蠢很有用),您可以将其转换为来自子选择的范围查询 - 我显示了一个相关的变体 in this answer。请注意,通常最好避免按函数结果分组...
  • @Clockwork-Muse 这很慢,我知道。但我只需要一个一次性查询。

标签: mysql sql


【解决方案1】:

如果您想排除零个月,请添加HAVING 条件,然后使用您的查询作为基础为每个公司选择AVG()

SELECT company_id, AVG(total)
FROM
  (SELECT DATE_FORMAT(i.created, '%Y-%m') as 'period',
          COUNT(id) as 'total',
          i.company_id
     FROM invoice i
     GROUP BY period, i.company_id
     HAVING COUNT(id)>0
  ) as T1
  GROUP BY company_id

【讨论】:

  • 谢谢,我想我可能需要为此使用临时表。
  • @Clockwork-Muse:你说得对,我最后还是错过了GROUP BY。现已修复。
  • ...并 +1。当然,这在大多数其他系统中不会成为问题,因为它们会为缺少的子句抛出错误。不过在 MySQL 中...
猜你喜欢
  • 1970-01-01
  • 2016-10-02
  • 2014-06-30
  • 2021-07-27
  • 2022-12-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多