记录组时间差小于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_name 列 under_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
函数可以在 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';
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_name 列 under_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
函数可以在 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';