当我有一个包含电影开始和结束时间的表格时,如何计算每小时观看的电影数量?

Posted

技术标签:

【中文标题】当我有一个包含电影开始和结束时间的表格时,如何计算每小时观看的电影数量?【英文标题】:How can I count the number of movies that are being watched in every hour when I have a table that contains movies start and end times? 【发布时间】:2017-06-20 16:17:22 【问题描述】:

我有一个看起来像这样的表:

start_timestamp        end_timestamp
2012-11-18 05:53:36.0  2012-11-18 7:46:40.0
2012-11-18 06:34:23.0  2012-12-18 09:21:57.0

我希望输出看起来像:

hour                   moves_being_played
2012-11-18 05:00:00.0  1
2012-11-18 06:00:00.0  2
2012-11-18 07:00:00.0  2
2012-11-18 08:00:00.0  1
2012-11-18 09:00:00.0  1

到目前为止,我已经尝试手动设置每小时的值并计算开始时间较短和结束时间较长的电影数量。

SELECT
COUNT(CASE WHEN HOUR(start_time) < 6 THEN 1 ELSE null END)
COUNT(CASE WHEN HOUR(start_time) < 7 THEN 1 ELSE null END) - COUNT(CASE WHEN HOUR(end_time) < 7 THEN 1 ELSE null END)
...
COUNT(CASE WHEN HOUR(start_time) < 9 THEN 1 ELSE null END) - COUNT(CASE WHEN HOUR(end_time) < 9 THEN 1 ELSE null END)
FROM table 

如果不手动设置每个小时的时间段并且结果是“长”而不是“宽”表,我该如何做到这一点?

【问题讨论】:

请用db平台标记,你试过什么? 他们说“你试过什么”,他们的意思是粘贴你在问题中尝试过的实际代码...... 这是一篇面向 sql server 的文章,但它可以为您的问题提供一些想法。 kodyaz.com/t-sql/… 你有一张包含所有可能时间戳的表格吗? @vkp 不,我没有,但看起来 Jeremy 发布的链接可用于创建一个(假设它可以从 SQL Server 为 HiveQL 或 SparkSQL 重写) 【参考方案1】:

我的方法是:

我递归地生成一天中的所有完整小时并将结果与​​电影表连接

with mycte as
(
    SELECT CAST('00:00:00' as time)  AS MyHour
    UNION ALL
    SELECT DATEADD(HOUR, 1, MyHour)
    FROM mycte 
    WHERE  MyHour < '23:00:00'
)
SELECT COUNT(*) AS movies_being_played
      ,CONVERT(DATETIME, CONVERT(CHAR(8), yourmovietable.start_timestamp, 112) + ' ' + CONVERT(CHAR(8), mycte.MyHour, 108))
  FROM mycte
  INNER JOIN yourmovietable
  ON mycte.MyHour BETWEEN CAST(yourmovietable.start_timestamp as time) 
                      AND CAST(yourmovietable.end_timestamp as time)                   
 GROUP BY CONVERT(DATETIME, CONVERT(CHAR(8), yourmovietable.start_timestamp, 112) + ' ' + CONVERT(CHAR(8), mycte.MyHour, 108))                      

【讨论】:

以上是关于当我有一个包含电影开始和结束时间的表格时,如何计算每小时观看的电影数量?的主要内容,如果未能解决你的问题,请参考以下文章

Array.append 覆盖不附加

计算每行数据库的 Biz 天数

上市电影+他们的海报

如果开始日期和结束日期跨越一个或多个月,则插入表格时日期格式会发生变化

如何向后和向前循环 Flash 电影的一部分(“乒乓”循环)

如何创建以时钟时间开始和结束的基于时间的延迟?