记录组时间差小于1h

Time difference under 1h for group of records

Table 看起来像这样

    Play_name       Status  Date
  1 Romeo & juliet  Start   23.01.2018 16:30:00
  2 Romeo & juliet  Break   23.01.2018 17:15:00
  3 Romeo & juliet  END     23.01.2018 18:30:00
  4 Hamlet          Start   25.01.2018 15:45:00
  5 Hamlet          END     25.01.2018 16:40:00

等等

我需要 return play_nameunder_hour 对所有播放时间少于 1 小时(从开始到结束)。

结果应如下所示:

   Play_name        under_hour
 1 Romeo & Juliet   NO
 2 Hamlet           Yes

我怎样才能做到这一点?

我们可以尝试按剧名聚合并使用数据透视表将开始和结束时间合并到一条记录中。然后,断言这两个时间戳之间的差异严格小于一小时。

SELECT
    Play_name
FROM yourTable
GROUP BY Play_name
HAVING
    EXTRACT(HOUR FROM MAX(CASE WHEN Status = 'END' THEN Date END) -
        MAX(CASE WHEN Status = 'Start' THEN Date END)) < 1

编辑:您似乎想要报告所有具有 yes/no 状态的播放。在这种情况下,您可以在 CASE 语句中使用我的 HAVING 子句中的逻辑。或者,直接使用上面@Jay 的回答。

SELECT
    Play_name,
    CASE WHEN  EXTRACT(HOUR FROM MAX(CASE WHEN Status = 'END' THEN Date END) - MAX(CASE WHEN Status = 'Start' THEN Date END)) < 1
         THEN 'NO'
    ELSE 'YES'
    END AS under_hour
FROM TABLENAME
GROUP BY Play_name

我想你不需要检查Status值,你需要做的就是获取每个play_name记录的最小和最大日期之间的时间差。

select  Play_name,CASE when (max(Date)-min(date)) > 1 then 'Yes' else 'No' end under_hour from table

LAG 函数可以在 SIGNDECODE 的贡献下使用:

select rownum rn, Play_name, 
       decode(sign(Finish_Time - Start_Time - (1/24)),-1,'Yes','NO') under_hour
  from
  (
   select Play_name, 
          lag(play_Date,1,null) over (partition by play_name order by play_Date) Start_Time, 
          Play_Date Finish_Time, Status
     from Plays
    where Status in ('Start','END')
    order by Play_Date
   ) 
where Status = 'END';

demo