mysql - 在具有计数条件的日期之间选择

标签 mysql time-series aggregate-functions

我有表user,其中包含login_time列。

我想选择一个月内登录次数超过 10 次的所有用户。

我尝试过这样的事情:

SELECT login_time, count(id) as loginCount FROM user 

WHERE login_time between DATE_SUB(login_time INTERVAL 1 month) AND login_time

GROUP BY id, MONTH(login_time) HAVING loginCount > 10;

我不确定我在日期之间的选择。 如何以一个月为间隔进行选择以避免重复记录。 例如,如果我有以下 login_time 值:

1. '2015-02-01 14:05:19'
2. '2015-01-21 14:05:19'
3. '2015-01-11 14:05:19'

3 和 2 都在 1 的月份范围内。 那么我会得到该值的双记录吗?

最佳答案

要查找在截至目前的月份中登录次数超过十次的用户,请执行以下操作。

SELECT COUNT(*) times_logged_in,
       userid
  FROM user
 WHERE login_time >= NOW() - INTERVAL 1 MONTH
 GROUP BY user_id
HAVING COUNT(*)> 10

要查找表中任意日历月内登录次数超过 10 次的用户,请执行以下操作。

SELECT COUNT(*) times_logged_in,
       DATE(DATE_FORMAT(login_time, '%Y-%m-01')) month_beginning,
       userid
  FROM user
 GROUP BY user_id, DATE(DATE_FORMAT(login_time, '%Y-%m-01'))
HAVING COUNT(*)> 10

这里的技巧是表达式DATE(DATE_FORMAT(login_time, '%Y-%m-01')),它将任何时间戳转换为其发生月份的第一天。

您的问题提到了这个WHERE条件:

WHERE login_time between DATE_SUB(login_time INTERVAL 1 month) AND login_time

这并没有做任何有趣的事情,因为它总是返回 true。每个给定的 login_time 始终落在您指定的时间间隔内。

编辑:如果需要,您可以按月分组(dt)。但我显示它的方式自动考虑了数年和数月,所以在我看来,它更适合准确的报告。

另一次编辑:此公式得出任何给定日期或时间戳项的前一个星期日。

FROM_DAYS(TO_DAYS(login_time) -MOD(TO_DAYS(login_time) -1, 7))

如果星期一是您所在管辖区一周的第一天,请将 -1 更改为 -2。按此函数进行分组优于 GROUP BY WEEK(login_time),因为 WEEK() 在日历年的开始和结束时会执行奇怪的操作。

这一切都在这里更详细地写了:http://www.plumislandmedia.net/mysql/sql-reporting-time-intervals/

关于mysql - 在具有计数条件的日期之间选择,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28385223/

相关文章:

java - 连接到 JDBC MySQL 数据库

python - 时间序列: EWMA pandas forecast

machine-learning - 使用不同长度的时间序列在 Keras 中训练 LSTM

mysql 字符串分割

mysql - 如何将数据库记录分组为 15 分钟的时间间隔

php - 如何通过 php/mysql 对我的日期进行排序?

MySQL 多列唯一索引与列无关

MySQL 多个 LEFT OUTER JOIN 错误

php - 无法使用 try-catch 处理 SQL 异常

python - 尝试使用 Pandas 系列的 datetime64 对象检查数据频率