我有一个由 user_id、action_date 组成的简单表
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_date,我需要检查在从该 action_date 倒数的 30 天内有多少不同的用户处于事件状态。
我知道我必须为每个 action_date 返回 30 天并计算该期间的不同活跃用户,我尝试过类似的方法,但它并没有像预期的那样工作,因为我需要每 30 天的不同计数进行 action_date 的天数。
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
最佳答案
听起来您需要为每个不同的 action_date
分配一个数字在你的 table 上。
因此,首先您需要一个显示操作日期的虚拟表。
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
然后您需要汇总此结果。
SELECT a.action_date, COUNT(DISTINCT b.user_id) user_count
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
GROUP BY a.action_date
ORDER BY a.action_date
我一步一步地写出来,希望您能了解如何使用结构化查询语言的结构化方面构建您的查询。
在编写这样的查询时,对沿途的每个步骤进行故障排除也很有帮助。如果你把整个事情都写出来,就很难找到问题。
( - INTERVAL 29 DAY
?您要求的是 30 天的范围。我已经包括了相关日期和之前的 29 天。)
请注意,如果您的 action_dates 是 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)
注意日期范围,当您使用 DATETIME
时项目,一直运行到但不包括 ( <
) 结束日期 ( action_date + INTERVAL 1 DAY
) 那天的午夜。
关于mysql - 一段时间内的不同计数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36862337/