如何根据mysql中的时间间隔对结果进行分组

时间:2017-04-13 09:47:21

标签: mysql

我被指派开发一个简单的点击计数器。我的表格如下 -

  ID | userID |     IP    | entityType| entityID |        date
-----+--------+-----------+-----------+----------+--------------------
  1  |    1   | 127.0.0.1 |    book   |   18     | 2017-01-27 10:02:12
  2  |    1   | 127.0.0.1 |    book   |   18     | 2017-01-27 10:02:30
  3  |    1   | 127.0.0.1 |    book   |   18     | 2017-01-27 10:02:42
  4  |    1   | 127.0.0.1 |    book   |   18     | 2017-01-27 10:02:48
  5  |    1   | 127.0.0.1 |    book   |   18     | 2017-01-27 10:02:56
  6  |    1   | 127.0.0.1 |    book   |   18     | 2017-01-27 10:03:03
  7  |    1   | 127.0.0.1 |    book   |   18     | 2017-01-27 10:03:21
  8  |    1   | 127.0.0.1 |    book   |   18     | 2017-01-27 10:03:31
  9  |    1   | 127.0.0.1 |    book   |   18     | 2017-01-27 10:03:38
 10  |    1   | 127.0.0.1 |    book   |   18     | 2017-01-27 10:03:44
 11  |    1   | 127.0.0.1 |    book   |   18     | 2017-01-27 10:04:01
 12  |    1   | 127.0.0.1 |    book   |   18     | 2017-01-27 10:04:13
 13  |    1   | 127.0.0.1 |    book   |   18     | 2017-01-27 10:04:30
 14  |    1   | 127.0.0.1 |    book   |   18     | 2017-01-27 10:04:37
 15  |    1   | 127.0.0.1 |    book   |   18     | 2017-01-27 10:04:56
 16  |    1   | 127.0.0.1 |    book   |   18     | 2017-01-27 10:05:10
 17  |    1   | 127.0.0.1 |    book   |   18     | 2017-01-27 10:05:18
 18  |    1   | 127.0.0.1 |    book   |   18     | 2017-01-27 10:05:41
 18  |    1   | 127.0.0.1 |    book   |   18     | 2017-01-27 10:05:56
 19  |    1   | 127.0.0.1 |    book   |   18     | 2017-01-27 10:06:15
 20  |    1   | 127.0.0.1 |    book   |   18     | 2017-01-27 10:06:26
 21  |    1   | 127.0.0.1 |    book   |   18     | 2017-01-27 10:06:43
 22  |    1   | 127.0.0.1 |    book   |   18     | 2017-01-27 10:06:58
 23  |    1   | 127.0.0.1 |    book   |   18     | 2017-01-27 10:07:21

我的问题是我需要根据时间间隔对结果进行分组。该间隔将由项目经理稍后定义,可以在1分钟到30分钟之间变化。背后的想法是,如果特定用户在定义的时间间隔内多次访问具有特定ID(实体ID)的特定页面(实体),则所有这些命中将被计为单击。将在此时间间隔内运行cronjob以累积然后存储在不同的表中。

我无法弄清楚应该如何接近。我真的很期待有一些指南。

提前致谢。

修改

由于我的问题被许多用户标记为某个问题的完全重复,因此我对于不充分解释我的问题感到内疚。

在我的问题被标记为完全重复的问题中,预期结果是计算的时间间隔。但我的问题与此不同。我需要一个解决方案,我可以在一个时间间隔内只计算一个。请考虑下表 -

  ID | userID |     IP    | entityType| entityID |        date
-----+--------+-----------+-----------+----------+--------------------
  1  |    4   | 127.0.0.1 |    book   |   18     | 2017-01-27 10:02:12
  2  |    4   | 127.0.0.1 |    book   |   18     | 2017-01-27 10:02:30
  3  |    4   | 127.0.0.1 |    book   |   18     | 2017-01-27 10:02:42
  4  |    4   | 127.0.0.1 |    book   |   18     | 2017-01-27 10:03:08
  5  |    4   | 127.0.0.1 |    book   |   18     | 2017-01-27 10:03:27

假设我的预期时间间隔定义为1 minute。请注意,示例userID 4entityID时间间隔18内访问了相同的1 minute (2017-01-27 10:02:12 - 2017-01-27 10:03:11) 4次。在这种情况下,命中应该计为1.因此只有COUNT(*)不足以实现我的结果。我想我需要使用mysql rank函数来解决它。但无法弄清楚如何。

我已更新我的示例数据集以描述特定案例。让我们假设我的时间间隔阈值是1分钟。根据我的原始数据,我希望结果如下 -

entityType| entityID | count
----------+----------+-------
   book   | 18       |  5

由于entity bookentityID 18的第一个匹配条目为2017-01-27 10:02:12,因此应将时间间隔视为2017-01-27 10:02:12 to 2017-01-27 10:03:11 。在此时间间隔之后,同一userIDentityentityID的下一个条目为2017-01-27 10:03:21,以便时间间隔为2017-01-27 10:03:21 to 2017-01-27 10:04:20

同一2017-01-27 10:02:12 2017-01-27 10:03:11entity book entityID18中有5个条目应计为一个条目。类似地,对于其余的行,应该总共有5个唯一的命中。

感谢任何帮助。

提前致谢。

0 个答案:

没有答案