假设你有一个像这样的表:
CREATE TABLE `checkins` (
`id` bigint(20) NOT NULL default '0',
`userid` bigint(20) default NULL,
`timestamp` timestamp NOT NULL default CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP,
PRIMARY KEY (`id`),
KEY `ind_userid` (`userid`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8
根据日期范围,我如何知道有多少用户每周活跃 3-5 天。
有点像
input - two months date range
output - 310 users were active 3-5 days a week
最佳答案
如果您创建一个每周一行的日历表,您应该能够使用这样的查询来解决您的问题:
SELECT userid
FROM (SELECT userid,
YEARWEEK(TIMESTAMP) AS year_week,
COUNT(DISTINCT DAYOFWEEK(TIMESTAMP)) AS check_in_days
FROM checkins
WHERE 1 = 1 -- This would be your date range filter
GROUP BY userid,
YEARWEEK(TIMESTAMP)
HAVING check_in_days BETWEEN 3 AND 5) AS user_weeks
GROUP BY userid
HAVING COUNT(year_week) = (SELECT COUNT(*)
FROM year_week
WHERE 1 = 1 -- This would be your date range filter
);
(我的周表在 2001 年到 2020 年之间的每一周都有一行。)
内部查询 (user_weeks) 为每个 {user_id, week} 返回一行,其中用户在该特定周内签到至少 3 天或最多 5 天。 (同一天签到的次数无关紧要)。外部查询为每个 {user_id} 返回一行,以及满足 3-5 天 checkin 要求的周数。 外部选择中的 having 子句过滤结果以仅包括 checkin 次数(周)与日期范围内实际周数一样多的用户。这应该满足“连续”周的要求。
如果这对您有帮助,请告诉我。
编辑 从函数 week() 更改为 yearweek()。
关于sql - 根据日期范围,我如何知道有多少用户每周活跃 3-5 天?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4384787/