Mysql 一段时间内的不同计数
我有一个简单的表,由用户id、操作和日期组成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-
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)