我正在尝试在网络应用中绘制活跃用户。我的数据库由两个主要表格user
和task
组成。 task
有一个user_id
。
我对活跃用户的定义是在给定结束日期的两周内创建了2个以上任务的用户。
所以,我需要一个SQL查询,它给出了给定开始日期和结束日期之间活动用户的数量。我能够通过将查询放在循环中,每次都拉动结果来做到这一点,但我希望能够在单个查询中完成。
返回的数据应该是:
Date Count
2010-01-01 4
2010-01-02 3
2010-01-03 5
编辑以澄清所需的数据集。
答案 0 :(得分:2)
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 :(得分:1)
带有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周的要求。
答案 2 :(得分:0)
这不适用于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天或更短时间内创建的用户的任务