【问题标题】:Active Users SQL query活跃用户 SQL 查询
【发布时间】:2010-11-30 20:23:00
【问题描述】:

我正在尝试在 web 应用中绘制活跃用户的图表。我的数据库由两个主表组成,user 和task。 task 有一个 user_id。

我对活跃用户的定义是:在给定结束日期的两周内创建了超过 2 个任务的用户。

所以,我需要一个 SQL 查询,它可以提供给定开始日期和结束日期之间的活跃用户数。我可以通过将查询放入循环中来做到这一点,每次都提取结果,但我希望能够在单个查询中完成。

返回的数据应该是这样的:

Date         Count
2010-01-01   4
2010-01-02   3
2010-01-03   5

编辑以阐明所需的数据集。

【问题讨论】:

    标签: sql mysql


    【解决方案1】:
    SELECT t.taskdate, COUNT(DISTINCT u.user_id)
        FROM user u
            INNER JOIN task t
                ON u.user_id = t.user_id
                    AND t.taskdate BETWEEN DATE_ADD(@EndDate, INTERVAL -2 WEEK) AND @EndDate
        GROUP BY t.taskdate
        ORDER BY t.taskdate
    

    【讨论】:

    • +1(至少我可以做的,因为我已经使用您的日期间隔解决方案来修复我的答案)
    • @Lieven:只要你借用我的代码,你可能想借用我最近的编辑。我修复了 DATE_ADD 以使用 MySQL 语法。
    • 这是一个很好的开始。我没有澄清的是,我需要在开始日期和结束日期之间的每一天的总数。例如:2010-01-01 = 4, 2010-01-02 = 3, 2010-01-03 = 5, ...
    • @Ian Silber:我编辑了答案以纳入新要求。
    • @Joe 谢谢!不过有一件事,这可以让我指定开始日期吗?例如,从 2010 年 1 月 1 日开始,到 2010 年 12 月 31 日结束,返回至少有一个活跃用户的每一天的数据。谢谢!
    【解决方案2】:

    带有HAVING 子句的GROUP BY 应该足以吸引所有用户

    SELECT u.user_id
    FROM   user u
           INNER JOIN task t ON t.user_id = u.user_id
    WHERE  date BETWEEN DATEADD(week, -2, <EndDate>) AND <EndDate>
    
    GROUP BY
           u.user_id
    HAVING COUNT(*) > 1
    

    为了得到总计数,将其包含在另一个语句中

    SELECT COUNT(*)
    FROM   (
             SELECT u.user_id
             FROM   user u
                    INNER JOIN task t ON t.user_id = u.user_id
             WHERE  date BETWEEN DATEADD(week, -2, <EndDate>) AND <EndDate>
             GROUP BY
                    u.user_id
             HAVING COUNT(*) > 1
           ) u
    

    编辑

    使用 Joe 发布的代码修复了 2 周的要求。

    【讨论】:

    • 我认为您需要修改“ AND 之间的日期”以匹配“2周内”的条件,否则它将起作用。
    • @sh_kamalh:修复了条件。
    • 这太棒了 - 但是,我需要能够指定开始和结束日期,并且对于开始和结束之间的每个日期,拉取该特定日期的活跃用户数。
    【解决方案3】:

    这不适用于 mysql,但它可以工作(我不确定 task_date + 14)。

    select *
    from user u
    where (select count(*) form task t where t.user_id = u.user_id and t.task_date + 14 > @end_date) > 2
    

    内部查询 select count... 获取在给定 end_date 前 14 天或更短的时间内为用户创建的任务

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-08-16
      • 1970-01-01
      • 2014-11-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多