【问题标题】:Average or calculate average平均或计算平均值
【发布时间】:2013-01-14 15:52:44
【问题描述】:

如果不是数字,有没有办法获得平均数量?
我的桌子:

ID|  CAT  |  TITLE  |     DATE            |
--|-------|---------|---------------------|
1 | CAT01 | TITLE01 | 2013-01-18 20:37:15 |
2 | CAT01 | TITLE02 | 2013-01-18 20:37:16 |
3 | CAT02 | TITLE03 | 2013-01-19 12:09:54 |

我如何获得每天帖子的 AVG?
现在我正在使用这个:

SELECT AVG(cat) / DATEDIFF('2013-01-19', '2013-01-18') as average 
FROM posts 
WHERE date BETWEEN '2013-01-18' AND '2013-01-19'"

但对我来说,它不会返回平均计数。也许我应该先 count(cat) AS cnt 然后使用 avg(cnt) AS average?
还是不能在非数字表上使用 AVG?

【问题讨论】:

  • 您可以按 DATE 进行分组,将日期格式化为 yyyy-MM-dd 并计算每只 CAT,通过此计数您可以获得平均值

标签: mysql sql average mean


【解决方案1】:

您可以一步完成。可以在此处找到经过测试的示例:http://sqlfiddle.com/#!2/05760/12

SELECT 
  COUNT(*) / 
  COUNT(DISTINCT cast(`date` as date)) avg_posts_per_day
FROM 
  posts

或者您可以分两步完成:

  1. 每天发帖,
  2. 平均第 1 步的结果。

可以在此处找到经过测试的示例:http://sqlfiddle.com/#!2/05760/4

SELECT 
  AVG(posts_per_day) AS AVG_POSTS_PER_DAY
FROM (    
  SELECT 
    CAST(`date` as date), 
    COUNT(*) posts_per_day
  FROM posts  
  GROUP BY 
    CAST(`date` as date)
) ppd

【讨论】:

  • posts_per_day 只是COUNT(*) 结果的别名(昵称)。
  • @bernie 我不确定这是否总是正确的......如果我们使用 '2013-01-17' 而不是 date='2013-01-18' 它仍然算 1.5(因为 18不存在且不计算在内),但我认为它应该返回 1(3 个帖子,3 天内)sqlfiddle.com/#!2/58d57/16
  • @fthiella:这取决于意图,对吧?分母可以是 1) 发帖天数(如我的回答),或 2) 总天数(如您的回答)。
【解决方案2】:

试试这个

   SELECT COUNT(cat)/2  as avrag
   FROM posts 

DEMO SQLFIDDLE

编辑:

如果你想使用两个日期之间的平均值,只需添加这个

     where date between 'the_date1' AND 'the_date2'

【讨论】:

  • 它可以工作,但我给出的表格只是一个例子。目前它有 146 行。所以它没有给我平均值。它只是将其除以 2。
  • 我说如果你想要一些两个日期之间的平均值,只需添加我的 WHERE 子句或你想要什么?
  • 您想要平均每天?还是每个给定的两个日期?
  • 我已经说过我需要每天。但是感谢您的帮助!
【解决方案3】:

您可以做的是获取总帖子数、自数据库中第一个时间戳以来的天数,并根据这两个数字计算平均值。

【讨论】:

    【解决方案4】:

    试试这个,格式化日期 yyyy-MM-dd 来统计每天的所有帖子,然后取每天的平均值

    SELECT 
       amount/total AS AVG_POSTS_PER_DAY, day
    FROM
      (
        SELECT COUNT(1) amount, DATE_FORMAT(DATE, '%Y-%m-%d') day,
        (SELECT COUNT(1) from posts) total
      FROM posts
      group by
        DATE_FORMAT(DATE, '%Y-%m-%d')) a
    group by day`
    

    【讨论】:

      【解决方案5】:

      我想你只需要用COUNT(*)计算行数,然后在datediff上加1:

      SELECT COUNT(*) / (DATEDIFF('2013-01-19', '2013-01-18')+1) as average 
      FROM posts 
      WHERE DATE(date) BETWEEN '2013-01-18' AND '2013-01-19'
      

      这将返回帖子的平均数量,计算没有帖子的天数。

      或者,根据你的追求,你可能会考虑这样的事情:

      SELECT
        COUNT(*) /
        (datediff(max(`date`), min(`date`))+1) as avg_posts
      FROM
        posts
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-06-19
        • 2022-11-21
        • 2017-02-06
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多