暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Oracle 基于时间休息的排名

ASKTOM 2020-08-11
263

问题描述

我想根据休息时间超过1小时来使卡车退出

就像下面的eg


卡车出口
T1下午10:00
T2下午10:05
T3下午12:00
T4下午12:05
T5下午12:10
T6下午12:20

结果应该像 ......离开休息超过1小时的差距

10:00 10:05 1
12:00 12:20 2



专家解答

我无法使您的实时SQL链接正常工作-您可以检查一下吗?

另外,不清楚超过1小时的休息意味着什么:

* 距离上次出口时间1小时?
* 自小组第一次退出时间起1小时?

无论哪种方式,从12c这是简单使用的模式匹配!

我假设你是说距离上次出口1小时。在这种情况下,您希望将所有行分组在一起,其中:

当前退出时间 <上一个退出时间1小时

我们可以将其定义为模式变量:

within_hour as exit_time < prev ( exit_time ) + 1/24
复制


如果您想要自组中第一次退出以来的时间,请更改prev -> first。

这个组中可以有任意数量的行。所以你想搜索任何行,后跟零或更多with_hour行:

pattern ( init within_hour* )
复制


给予:

create table t (
  truck     varchar2(2),
  exit_time date
);

insert into t values ( 'T1', to_date ( '2020-08-11 10:00 AM', 'yyyy-mm-dd hh:mi am' ) );
insert into t values ( 'T2', to_date ( '2020-08-11 10:05 AM', 'yyyy-mm-dd hh:mi am' ) );
insert into t values ( 'T3', to_date ( '2020-08-11 12:00 PM', 'yyyy-mm-dd hh:mi am' ) );
insert into t values ( 'T4', to_date ( '2020-08-11 12:05 PM', 'yyyy-mm-dd hh:mi am' ) );
insert into t values ( 'T5', to_date ( '2020-08-11 12:10 PM', 'yyyy-mm-dd hh:mi am' ) );
insert into t values ( 'T6', to_date ( '2020-08-11 12:20 PM', 'yyyy-mm-dd hh:mi am' ) );

commit;

select * from t
  match_recognize (
    order by exit_time
    measures
      first ( exit_time ) as start_time,
      last ( exit_time ) as end_time,
      match_number() as grp
    pattern ( init within_hour* )
    define
      within_hour as exit_time < prev ( exit_time ) + 1/24
  );

START_TIME              END_TIME                GRP   
11-AUG-2020 10:00:00    11-AUG-2020 10:05:00         1 
11-AUG-2020 12:00:00    11-AUG-2020 12:20:00         2 
复制


我看到你在11g上,所以这不会起作用 :( 还有其他各种方法可以解决这个问题,比如使用递归:

with rws as (
  select t.*,
         row_number () over ( 
           order by exit_time
         ) rn
  from   t
), grps ( exit_time, start_time, end_time, rn, grp ) as (
  select exit_time, exit_time, exit_time, rn, 1
  from   rws
  where  rn = 1
  union all
  select r.exit_time, 
         case
           when r.exit_time > g.end_time + 1/24 then r.exit_time
           else g.start_time
         end, 
         r.exit_time, r.rn, 
         case
           when r.exit_time > g.end_time + 1/24 then grp + 1
           else grp
         end 
  from   grps g
  join   rws r
  on     g.rn + 1 = r.rn
)
  select start_time, max ( end_time ), grp 
  from   grps
  group  by grp, start_time
  order  by grp;
  
START_TIME              MAX(END_TIME)           GRP   
11-AUG-2020 10:00:00    11-AUG-2020 10:05:00         1 
11-AUG-2020 12:00:00    11-AUG-2020 12:20:00         2 
复制

文章转载自ASKTOM,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论