【问题标题】:Average posts per user by month in previous year- MYSQL上一年每个用户的平均帖子数 - MYSQL
【发布时间】:2014-03-26 01:02:15
【问题描述】:

用户表:

+------------+---------+---------+ |编号 |名称 |created_at | +------------+---------+---------+ | 1 | AAA | 2013-01-10 01:30:00 | | 2 |血脑屏障 | 2013-02-14 01:30:00 | | 3 | CCC | 2013-03-29 01:30:00 | | 4 | DDD | 2013-04-30 01:30:00 | | 5 |电子电气设备 | 2013-05-10 01:30:00 | | 6 | FFF | 2013-06-10 01:30:00 | | 7 | GGG | 2013-07-10 01:30:00 | | 8 |信息系统 | 2013-08-10 01:30:00 | | 9 |国际教育协会 | 2013-09-10 01:30:00 | | 10 |国际金融论坛 | 2013-10-10 01:30:00 | | 11 | IIG | 2013-11-10 01:30:00 | | 12 | IIH | 2013-12-18 01:30:00 | | 13 | IHH | 2013-10-18 01:30:00 | | 14 |啊哈 | 2013-02-18 01:30:00 | | 15 | AEH | 2013-02-18 01:30:00 | +------------+---------+---------+

帖子表:

+------------+--------------------------------+---------------- -----+ |编号 |用户 ID | created_at | | 1 | 1 | 2013-02-10 01:30:00 | | 2 | 2 | 2013-03-10 01:30:00 | | 3 | 2 | 2013-03-10 01:30:00 | | 4 | 7 | 2013-04-10 01:30:00 | | 5 | 1 | 2013-05-10 01:30:00 | | 6 | 8 | 2013-05-10 01:30:00 | | 7 | 3 | 2013-06-10 01:30:00 | | 8 | 6 | 2013-07-10 01:30:00 | | 9 | 7 | 2013-08-10 01:30:00 | | 10 | 9 | 2013-09-10 01:30:00 | | 11 | 11 | 2013-10-10 01:30:00 | | 12 | 4 | 2013-11-10 01:30:00 | +------------+--------------------------------+---------------- -----+

从上面的表格中,我可以找出前一年每个用户的平均帖子数。请注意:1 月和 12 月没有帖子。因此,这些月的平均值为 0。

临时表(不存在,仅作示例):帖子总数和每月累计用户数:

上一年的每月 total_users(累计):

+--------------+-------------------+ |月 | total_users(累计) |一月 | 1 | |二月 | 4 | |三月 | 5 | |四月 | 6 | |五月 | 7 | |君 | 8 | |七月 | 9 | |八月 | 10 | |九月 | 11 | |十月 | 13 | |十一月 | 14 | |十二月 | 15 | +--------------+-------------------+

每月 total_posts(上一年):

+--------------+-------------------+ |月 |总帖子 | |一月 | 0 | |二月 | 1 | |三月 | 2 | |四月 | 1 | |五月 | 2 | |君 | 1 | |七月 | 1 | |八月 | 1 | |九月 | 1 | |十月 | 1 | |十一月 | 1 | |十二月 | 0 | +--------------+-------------------+

方程:

average_posts_per_user:

total_posts_per_month / total_users_per_month(累计)

预期结果:

+--------------+-------------------+ |月 |平均帖子 | |一月 | 0 | |二月 | 0.25 | |三月 | 0.4 | |四月 | 0.16 | |五月 | 0.28 | |君 | 0.12 | |七月 | 0.11 | |八月 | 0.1 | |九月 | 0.09 | |十月 | 0.8 | |十一月 | 0.7 | |十二月 | 0 | +--------------+-------------------+

提前致谢。

【问题讨论】:

  • 是total_users 和total_users 真正的桌子吗?
  • 不,我只是举个例子。只有两个表用户和帖子。

标签: mysql sql


【解决方案1】:

怎么样

SELECT
  userqry.`month`,
  total_users,
  IFNULL(month_posts,0) AS total_posts,
  IFNULL(month_posts,0)/total_users AS avg_posts
FROM
  (SELECT
    `month`,
    @usernum:=@usernum+new_users AS total_users
  FROM (
    SELECT
      DATE_FORMAT(created_at,'%M') AS `month`,
      COUNT(id) AS new_users
    FROM users
    GROUP BY 
      MONTH(created_at)
  ) AS baseview,
  (SELECT @usernum:=0) AS usernuminit
  ) AS userqry
LEFT JOIN
  (SELECT
    DATE_FORMAT(created_at,'%M') AS `month`,
    COUNT(id) AS month_posts
  FROM posts
  GROUP BY 
    MONTH(created_at)
  ) AS postqry
ON userqry.`month`=postqry.`month`

SQLfiddle

编辑

对于年份比较,请使用:

SELECT
  2013 AS reportyear,
  view2013.*
FROM (
  -- query from above with "WHERE created_at BETWEEN '2013-01-01' AND '2013-12-31'" in both inner queries
) AS view2013
UNION
SELECT
  2014 AS reportyear,
  view2014.*
FROM (
  -- query from above with "WHERE created_at BETWEEN '2014-01-01' AND '2014-12-31'" in both inner queries
) AS view2015

或(推荐)从您的应用程序中多次运行上述查询,每次都使用不同的年份。

【讨论】:

  • 正是我需要的。谢谢。
  • 您可能想在两个内部查询中使用WHERE created_at BETWEEN '2013-01-01' AND '2013-12-31' 来过滤年份!
  • 如果我想在一个查询中同时选择去年和当年的数据,我应该改变什么?
  • 为了比较去年和当年的平均值,我要画一个图表。
  • 是的!谢谢尤根!我一直在寻找这个。
【解决方案2】:

如果您不需要平均 = 0 的行

SELECT
    SUBSTRING(created_at,1,7) as `month`,
    (COUNT(DISTINCT id) / COUNT(DISTINCT user_id)) as `average`
FROM
    posts 
WHERE
    YEAR(created_at) = '2013'
GROUP BY
    SUBSTRING(created_at,1,7)

如果您需要平均 = 0 的行

SELECT
    tmonths.`month`,
    (COUNT(DISTINCT posts.id) / COUNT(DISTINCT posts.user_id)) as `average`
FROM
    (
        SELECT '2013-01' as `month`
        UNION SELECT '2013-02' as `month`
        UNION SELECT '2013-03' as `month`
        UNION SELECT '2013-04' as `month`
        UNION SELECT '2013-05' as `month`
        UNION SELECT '2013-06' as `month`
        UNION SELECT '2013-07' as `month`
        UNION SELECT '2013-08' as `month`
        UNION SELECT '2013-09' as `month`
        UNION SELECT '2013-10' as `month`
        UNION SELECT '2013-11' as `month`
        UNION SELECT '2013-12' as `month`
    ) tmonths
LEFT JOIN
    posts ON SUBSTRING(posts.created_at,1,7) = tmonths.`month`
GROUP BY
    tmonths.`month`

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-08
    • 1970-01-01
    • 1970-01-01
    • 2016-05-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多