【问题标题】:How can I figure out when a user is watching both a movie and another movie's credits?如何确定用户何时同时观看一部电影和另一部电影的演职员表?
【发布时间】:2016-08-16 21:44:40
【问题描述】:

我有一张看起来像(user_id, movie_id, start_timestamp, end_timestamp, reason_for_end) 的表。电影可以因为用户关闭它们而结束(reason_for_end == 'user_initiated'),也可以因为演职员表结束(reason_for_end == 'inactivity')。学分总是正好持续两个小时。

我想知道用户在另一部电影处于制作人员阶段时开始观看新电影的总次数。

另外,我还想知道用户观看一部电影的总时间,而另一部电影的演职员表仍在滚动。

编辑: 给定表格的示例:

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

【问题讨论】:

  • 似乎您只需要设置正确的 SELF JOIN 或 WHERE IN 或 WHERE EXISTS 子选择语句。但是您的问题并不完全清楚,也许您可​​以提供一些示例数据和基于该示例的所需结果,这将帮助我们理解所需的逻辑。 meta.stackoverflow.com/questions/271055/…
  • 刚回来,问题的更新很好,看起来 Robert 为您提供了一些东西,希望能让您走上正轨。

标签: sql datetime time concurrency hiveql


【解决方案1】:

怎么样?

您应该根据目标数据库语法调整日期时间处理。另外,我不知道您希望如何处理用户同时在多部电影之间跳转的情况 - 这取决于您 ;-)

否则,这应该可以完成工作:

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

【讨论】:

  • 您可能可以取出 AND movie1.id
  • 将检查是否会尽快工作。顺便说一句,调整日期时间处理是什么意思?
  • movie1.end_timestamp - '2hours'::interval 是 PostgreSQL 特定的语法。你可能需要稍微改变一下。
  • 啊,有道理。在 LEFT JOIN 子句中应该有另一个 AND 语句,以考虑到 movie1 必须因为不活动而结束,对吧?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-06-25
  • 1970-01-01
  • 1970-01-01
  • 2015-06-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多