Sql 我如何判断用户何时同时观看一部电影和另一部电影';谁的学分?
我有一个表,看起来像Sql 我如何判断用户何时同时观看一部电影和另一部电影';谁的学分?,sql,datetime,time,concurrency,hiveql,Sql,Datetime,Time,Concurrency,Hiveql,我有一个表,看起来像(用户id、电影id、开始时间戳、结束时间戳、结束原因)。电影可以因为用户关闭而结束(reason\u for_end=='user\u initiated'),也可以因为学分结束而结束(reason\u for_end=='inactive')。学分总是正好持续两个小时 我想知道一个用户开始一部新电影的总次数,而另一部电影处于信用阶段 另外,我还想知道一个用户在观看一部电影的总时间,而另一部电影的积分还在滚动 编辑: 表中给出的示例: user_id movie_id
(用户id、电影id、开始时间戳、结束时间戳、结束原因)
。电影可以因为用户关闭而结束(reason\u for_end=='user\u initiated'
),也可以因为学分结束而结束(reason\u for_end=='inactive'
)。学分总是正好持续两个小时
我想知道一个用户开始一部新电影的总次数,而另一部电影处于信用阶段
另外,我还想知道一个用户在观看一部电影的总时间,而另一部电影的积分还在滚动
编辑:
表中给出的示例:
user_id movie_id start_timestamp end_timestamp reason_for_end
1 1 2012-11-18 05:53:36.0 2012-11-18 12:46:40.0 'inactivity'
1 2 2012-11-18 11:34:23.0 2012-12-18 13:21:57.0 'user_initiated'
示例结果表1:
user_id times_new_started_while_old_in_credits
1 1
示例结果表2:
user_id total_overlap_in_seconds
1 4320
怎么样
您应该根据目标数据库语法调整日期时间处理。另外,我不知道当用户同时在多部电影之间切换时,您希望如何处理这种情况—这取决于您;-)
否则,这应该可以完成以下工作:
SELECT movie1.user_id, count(*), sum(movie1.end_timestamp - movie2.start_timestamp)
FROM movies movie1
LEFT JOIN movies movie2
ON movie1.user_id = movie2.user_id
AND movie1.reason_for_end = 'inactivity'
WHERE movie2.start_timestamp BETWEEN movie1.end_timestamp - '2hours'::interval AND movie1.end_timestamp
AND movie1.user_id = 1 /* optional */
GROUP BY movie1.user_id
似乎您只需要设置正确的自联接,或者WHERE IN或WHERE EXISTS subselect语句。但是你的问题并不完全清楚,也许你可以提供一些样本数据和基于该样本的预期结果,帮助我们理解所需的逻辑。刚刚回来,问题的更新很好,看起来Robert向你提供了一些东西,希望能让你走上正轨。你可能可以拿出和movie1.id