记录组的时差小于1小时

时间:2018-04-13 10:51:36

标签: sql oracle

表格如下

    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

对于持续时间不足1小时(从开始到结束)的所有播放,我需要将 play_name under_hour 列一起返回“是”。

结果应该是这样的:

   Play_name        under_hour
 1 Romeo & Juliet   NO
 2 Hamlet           Yes

我如何实现这一目标?

4 个答案:

答案 0 :(得分:2)

1

答案 1 :(得分:2)

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

答案 2 :(得分:1)

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

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

编辑:您似乎想要报告所有播放,状态为是/否。在这种情况下,您可以在HAVING语句中使用CASE子句中的逻辑。或者,只需按上面@Jay的答案。

答案 3 :(得分:0)

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

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