lag over 函数

with ta as
(select '723488' as emp_code,
         to_date('2017/7/3 14:00', 'yyyy/mm/dd hh24:mi') as start_time,
         to_date('2017/7/3 15:30', 'yyyy/mm/dd hh24:mi') as end_time
    from dual
  union all
  select '723488' as emp_code,
         to_date('2017/7/3 16:00', 'yyyy/mm/dd hh24:mi') as start_time,
         to_date('2017/7/3 17:00', 'yyyy/mm/dd hh24:mi') as end_time
    from dual
  union all
  select '723488' as emp_code,
         to_date('2017/7/3 16:00', 'yyyy/mm/dd hh24:mi') as start_time,
         to_date('2017/7/3 17:30', 'yyyy/mm/dd hh24:mi') as end_time
    from dual
  union all
  select '723488' as emp_code,
         to_date('2017/7/3 16:30', 'yyyy/mm/dd hh24:mi') as start_time,
         to_date('2017/7/3 18:00', 'yyyy/mm/dd hh24:mi') as end_time
    from dual
  union all
  select '723488' as emp_code,
         to_date('2017/7/3 17:00', 'yyyy/mm/dd hh24:mi') as start_time,
         to_date('2017/7/3 18:00', 'yyyy/mm/dd hh24:mi') as end_time
    from dual
  union all
  select '723488' as emp_code,
         to_date('2017/7/3 17:10', 'yyyy/mm/dd hh24:mi') as start_time,
         to_date('2017/7/3 18:30', 'yyyy/mm/dd hh24:mi') as end_time
    from dual
 
  ),
  tb as (
select emp_code, nvl(lag(end_time)over(partition by emp_code order by start_time, end_time), start_time) as last_end_time, start_time, end_time
from ta
)
select tb.*, (end_time - case when last_end_time > start_time then last_end_time else start_time end) * 24
from tb

Hive版本
set mapred.job.queue.name=root.dw ;
with ta as
(select '723488' as emp_code,
         '2017-7-3 14:00:00' as start_time,
         '2017-7-3 15:30:00' as end_time
  union all
  select '723488' as emp_code,
         '2017-7-3 16:00:00' as start_time,
         '2017-7-3 17:00:00' as end_time
  union all
  select '723488' as emp_code,
         '2017-7-3 16:00:00' as start_time,
         '2017-7-3 17:30:00' as end_time
  union all
  select '723488' as emp_code,
         '2017-7-3 16:30:00' as start_time,
         '2017-7-3 18:00:00' as end_time
  union all
  select '723488' as emp_code,
         '2017-7-3 17:00:00' as start_time,
         '2017-7-3 18:00:00' as end_time
  union all
  select '723488' as emp_code,
         '2017-7-3 17:10:00' as start_time,
         '2017-7-3 18:30:00' as end_time
  ),
  tb as (
select emp_code, nvl(lag(end_time)over(partition by emp_code order by start_time, end_time), start_time) as last_end_time, start_time, end_time
from ta
),
tc as(
select emp_code,  case when last_end_time > start_time then last_end_time else start_time end as start_time, end_time
from tb
)
select emp_code,start_time,end_time,  datediff(to_date(end_time) , to_date(start_time) ) * 24 + hour(end_time) - hour(start_time) + (minute(end_time) - minute(start_time)) / 60
from tc

猜你喜欢

转载自javayuanliwang.iteye.com/blog/2390983