Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 一段时间内的不同计数_Mysql_Datetime_Aggregate Functions - Fatal编程技术网

Mysql 一段时间内的不同计数

Mysql 一段时间内的不同计数,mysql,datetime,aggregate-functions,Mysql,Datetime,Aggregate Functions,我有一个简单的表,由用户id、操作和日期组成 user_id action_date user_001 2016-04-15 user_002 2016-04-15 user_003 2016-04-15 user_002 2016-04-15 user_001 2016-04-15 user_004 2016-04-16 user_005 2016-04-16 user_001 2016-04-16 user_001 2016-04-

我有一个简单的表,由用户id、操作和日期组成

user_id    action_date
user_001    2016-04-15
user_002    2016-04-15
user_003    2016-04-15
user_002    2016-04-15
user_001    2016-04-15
user_004    2016-04-16
user_005    2016-04-16
user_001    2016-04-16
user_001    2016-04-16
user_001    2016-04-16
对于数据库中的每个action_日期,我需要检查从该action_日期算起的30天内有多少不同的用户处于活动状态

我知道我必须为每个操作日期返回30天,并计算该期间的不同活动用户,我尝试了类似的方法,但效果并不理想,因为我需要为每个操作日期的30天进行不同的计数

SELECT action_date, COUNT (DISTINCT user_id) from Table_1 where user_id IN
(SELECT user_id from Table_1
WHERE action_date Between DATEADD(day,-30,action_date) and action_date)
GROUP BY action_date
上述查询足以获取结果


上面的查询足以获取结果,听起来您需要表中每个不同的
操作\u日期的数字

因此,首先需要一个显示操作日期的虚拟表

  SELECT DISTINCT action_date FROM Table_1
然后,您需要将该虚拟表连接到原始表,以选择30天范围:

  SELECT a.action_date, b.user_id
    FROM (
           SELECT DISTINCT action_date FROM Table_1
         ) a
    LEFT JOIN Table_1 b ON b.action_date >= a.action_date - INTERVAL 29 DAY
                       AND b.action_date <= a.action_date

请注意,当您使用
DATETIME
项时,日期范围如何一直运行到,但不包括(
),听起来您需要为表中每个不同的
操作\u日期
指定一个数字

因此,首先需要一个显示操作日期的虚拟表

  SELECT DISTINCT action_date FROM Table_1
然后,您需要将该虚拟表连接到原始表,以选择30天范围:

  SELECT a.action_date, b.user_id
    FROM (
           SELECT DISTINCT action_date FROM Table_1
         ) a
    LEFT JOIN Table_1 b ON b.action_date >= a.action_date - INTERVAL 29 DAY
                       AND b.action_date <= a.action_date

请注意,当您使用
DATETIME
项时,日期范围如何一直运行到,但不包括(
您从该查询中获得的输出?您从该查询中获得的输出是什么?
  SELECT DATE(a.action_date) action_date, 
         COUNT(DISTINCT b.user_id) user_count
    FROM (
           SELECT DISTINCT DATE(action_date) action_date FROM Table_1
         ) a
    LEFT JOIN Table_1 b ON b.action_date >= a.action_date - INTERVAL 29 DAY
                       AND b.action_date < a.action_date + INTERVAL 1 DAY
   GROUP BY DATE(a.action_date)
   ORDER BY DATE(a.action_date)