计算每周重复用户-MySQL



我的目标是计算健身应用程序的每周重复用户。我将每周重复用户定义为在过去7天内创建帐户并在同一7天内完成两次实际训练的用户。

有几个条件构成实际训练:

  1. 锻炼时间必须在10分钟到2小时(或240分钟(之间。我已经介绍了这一部分(或者至少到目前为止,在提到如何解决第二个条件的任何建议之前,我已经介绍过了(
  2. 如果用户在一天内开始两次训练,则第一次训练结束时间和第二次训练开始时间之间必须有30分钟的间隔(以便计算两次训练(在一天的剩余时间里,这种情况将持续到任何后续的n次训练中(认为可能需要某种类型的递归CTE,但不知道如何实现(。因此,如果他们在一天内开始三次锻炼,那么第二次锻炼的结束时间和第三次锻炼的开始时间之间必须有30分钟的间隔(以便计算第三次训练(

下面是我写的代码,用于获取显示在同一日期但不同时间完成训练的所有记录。但是,它显示了重复的对。例如,一旦我有一个训练ID 36和37配对的记录,我就不需要另一个显示37和36配对的记录。

select 
w1.workout_id,
w1.user_id,
w1.started_at,
w1.ended_at,
w2.workout_id,
w2.started_at,
w2.ended_at
from workouts w1 
join workouts w2 
on w1.user_id = w2.user_id
and date(w1.started_at) = date(w2.started_at)
and time(w1.started_at) <> time(w2.started_at);

以下是我使用上面的代码收到的SQL结果片段:SQL日期和时间结果

你知道我如何消除重复,确保同一天开始的训练的结束时间和开始时间之间有30分钟的间隔,然后只计算那些符合这些条件的记录吗

提前感谢您的帮助!

根据给定的信息,我将尽力回答您的问题。我看你的问题有两部分:

Q1(在连接w1和w2时,去掉重复项。

A1(我相信你可以通过修改联接子句的最后一行来做到这一点;并且时间(w1.started_at(<gt;时间(w2.started_at(";到时间(w1.started_at(<时间(w2.started_at(。这将确保后期的训练不会映射到早期的训练。

Q2(确保同一天的锻炼结束时间和开始时间之间有30分钟的间隔,并在满足这两个条件的情况下计算总记录。

A2(对于解决第二部分,你已经做得很好了;并且日期(w1.started_at(=日期(w2.started_ant(";在join子句中。我会按照以下方式编写您的代码。

with rawdata as 
(
select 
w1.workout_id,
w1.user_id,
w1.started_at,
w1.ended_at,
w2.workout_id,
w2.started_at,
w2.ended_at,
datediff(minutes, w2.started_at, w1.ended_at) as time_gap
from workouts w1 
join workouts w2 
on w1.user_id = w2.user_id
and date(w1.started_at) = date(w2.started_at)
and time(w1.started_at) < time(w2.started_at)
)
select count(*) from rawdata where time_gap > 30;

相关内容

  • 没有找到相关文章

最新更新