表格如下
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
我如何实现这一目标?
答案 0 :(得分:2)
1
答案 1 :(得分:2)
LAG
功能可以与SIGN
和DECODE
的贡献一起使用:
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';
答案 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