sql - 根据日期范围,我如何知道有多少用户每周活跃 3-5 天?

标签 sql mysql algorithm

假设你有一个像这样的表:

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/

相关文章:

php - 如何按旧日期获取多个表的行(逐行)

mysql - 如何使用 Node.js 和 mysql2 连接到数据库来调试 Azure Function

java - 查找 Java 数组中最长的向下序列

java - 链接二叉树并删除叶子

c# - 形成sql以将bool返回给c#

sql - 如何简化此 SQL 查询?

php - SQL Rand() 给出结果集但无法获取结果

php - 在文本框中从数据库中搜索数据以显示 - Laravel

string - 输出此字符串序列的第 n 遍

sql - 选择两个日期之间的所有数据