0

在 MySQL 中,我有一个记录用户“操作”的表(操作可以是任意数量的事物:点击、购买等)。该表如下所示,其中 action_id 是唯一的:

+--------------------------------------------+
|               table_actions                |
+--------------------------------------------+
| action_id | user_id |     date_created     |
+-----------+---------+----------------------+
|         1 |     321 |  2011-01-21 06:00:00 |
+-----------+---------+----------------------+
|         2 |     123 |  2011-02-21 06:00:00 |
+-----------+---------+----------------------+
|         3 |     456 |  2011-03-21 06:00:00 |
+-----------+---------+----------------------+
|         4 |     654 |  2011-04-21 06:00:00 |
+--------------------------------------------+

我想在 30 个月的日期范围内找到相隔不超过一年的三个不同的 user_ids 的数量。我的第一次尝试是这样的:

select ta.user_id
from table_actions ta
where ta.date_created > DATE_SUB(now(),interval 30 month)
group by ta.user_id
having COUNT(ta.action_id) > 2 AND DATEDIFF(MAX(ca.created_at),MIN(ca.created_at)) > 364;

这运行得很好,但是仅检查用户第一次和最后一次操作之间的差异时会出错。如果用户的第一次和最后一次操作相隔 30 个月,但在这段时间的某个时间段内,他们在 3 天内采取了 3 次操作,则我的查询不会计算它们。

我的研究发现了一些关于日期范围的帖子,但没有一个帖子在某个范围内的某个范围内查找特定数量的事件。

我假设这可能涉及某种循环或行编号,但我很快就达到了我的知识极限。

更新1:

如果一个真实世界的例子会有所帮助:

Jane 在 2010 年 3 月、2011 年 3 月、2011 年 4 月和 2011 年 12 月采取行动。

John 在 2010 年 1 月、2011 年 1 月、2011 年 2 月和 2012 年 3 月采取行动。

每个人在过去 30 个月内采取了 3 次或更多行动,但只有 Jane 在过去 30 个月内的 12 个月内采取了 3 次或更多行动。我正在寻找一个返回所有 Janes 的查询。

我遇到困难的地方是考虑到用户在过去 30 个月内可以采取任意数量的操作这一事实。如果它们仅限于 3 个动作,这将很简单。但是,我不知道如何让一个在过去 30 个月内采取 5 次行动的用户检查其中 3 次行动是否在一年内下降。

希望这有助于澄清。感谢大家。

4

0 回答 0