mysql - 一段时间内的不同计数

标签 mysql datetime aggregate-functions

我有一个由 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/

相关文章:

日期时间到日期的 Mysql 转换未反射(reflect)在输出中

python - 如何使用 python 2.7 将变量的值插入到 mysql 中?

sql-server - 在一个查询中查找多个最大日期

elasticsearch - 在elasticsearch中按计数过滤

sql - 将查询中的单个列与多个列聚合

mysql - Flask SQL-Alchemy 查询为我的数据库中存在的数据返回空值。可能是什么原因

mysql - 添加自定义行号

python - 用一个月而不是一年创建 Pandas 时间序列

mysql GROUP BY 与 DISTINCT 不匹配

mysql - SQL 内连接分组依据