【问题标题】:MySql query Script to count active users in every monthMySql 查询脚本来统计每个月的活跃用户
【发布时间】:2016-02-04 23:12:43
【问题描述】:

我需要查询 Mysql 来查找某个日期范围内每个月的活跃用户数。活跃用户是本月和前一个月(两个月不只是其中一个月)有登录日志记录的用户。

这是一个用于表格和测试数据的脚本。

CREATE TABLE `logger` (
  `id` INTEGER NULL AUTO_INCREMENT DEFAULT NULL,
  `UserId` INTEGER NULL DEFAULT NULL,
  `loginDate` DATE NULL DEFAULT NULL,
  PRIMARY KEY (`id`)
);

INSERT INTO `logger` (`UserId`,`loginDate`) VALUES
('1001','20151109'),
('1002','20151103'),
('1003','20151111'),
('1002','20151205'),
('1003','20151208'),
('1001','20160103'),
('1002','20160105');

我需要这样的结果,范围从 20151201 到 20160201

------------------------------
year |month |users |activeUsers
2015 |12    |2     |2 
2016 |01    |2     |1 // only uid 1002 have activity in past month 20151205

准备使用在线表http://sqlfiddle.com/#!9/e9881

【问题讨论】:

  • ('1001','20160103') vs "只有 uid 1002 在过去一个月有活动" 是哪一个?
  • 编辑您的问题并包含您迄今为止尝试过的内容也是一个好主意。
  • @miken32 这个 -> ('1002','20151205')

标签: mysql sql


【解决方案1】:

你可以用一个技巧来做到这一点。从每个日期开始添加一个月,然后您可以使用union allaggregation 进行计数:

select year(logindate), month(logindate), count(distinct userid)
from ((select logindate, userid
       from logger
      ) union all
      (select date_add(longdate, interval 1 month), userid
       from logger
      )
     ) l
group by year(logindate), month(logindate)
order by 1, 2;

编辑:

哦,我误解了这个问题。您需要连续两个月成为活跃用户。我知道用户登录会使用户活跃两个月。好的,你可以通过joinexists 解决这个问题:

select year(l.logindate), month(l.logindate), count(distinct l.userid)
from logger l
where exists (select 1
              from logger l2
              where l2.userid = l.userid and
                    year(date_sub(l.logindate, interval 1 month)) = year(l2.logindate) and
                    month(date_sub(l.logindate, interval 1 month)) = month(l2.logindate)
             )
group by year(l.logindate), month(l.logindate);

【讨论】:

  • 这是结果,最后一条记录不对sqlfiddle.com/#!9/e9881/27
  • @Reza 。 . .这将包括未来一个月。它符合你的定义。但是,如果你想排除它,你可以添加having count(distinct month(logindate)) = 2
  • 好的,看起来我们已经接近结果了,但它仍然给我一个错误的结果,因为它计算了过去一个月登录过的用户,但是不是这个月,他们不再活跃,我应该在 2016-01 和 2015-12 获得 1 个用户,但是您的查询给了我 3 个错误的用户。我也测试了这条线,它什么也没返回!!!
  • @Reza 。 . .根据您对所需内容的描述,“3”对于 2016-01 是正确的。用户是 1002、1003 和 1001。
  • 非常感谢您抽出宝贵的时间但是,我的问题中也有一个结果表,我需要一个完全一样的结果,我认为我的描述也是这样,所以也许您的解决方案是相关的另一个问题,我想。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-31
  • 1970-01-01
  • 1970-01-01
  • 2020-09-13
  • 2019-10-25
  • 1970-01-01
相关资源
最近更新 更多