2014-12-04 37 views
1

喜已经TE以下数据:的Oracle 10g:HOWTO合计按日期差异

KEY     VALUE    TIMESTAMP 
-------------- ---------- ----------------------- 
0F8CE962    900   20141124054503 
0F8CE962    900   20141124082431 
0F8CE962    0   20141124083808 
0F8CE962    0   20141124104408 
0F8CE962    0   20141124105009 
0F8CE962    0   20141124110213 
0F8CE962    900   20141124110720 
0F8CE962    900   20141125051641 
0F8CE962    0   20141125054112 

每一行是从下约15分钟“遥远”,除了最后两个。 如果我执行:

select KEY, sum(VALUE), min(TIMESTAMP), max(TIMESTAMP) 
from myTable 
group by KEY 

我得到的(当然)

KEY   sum(VALUE)   min(TIMESTAMP)   max(TIMESTAMP) 
-------------- ---------- ----------------------- ----------------------- 
0F8CE962    3600   20141124054503   20141125054112 

我需要的仅仅是那不同,行一次奉命聚集,最多15分钟。这是我想要的:

select KEY, sum(VALUE), min(TIMESTAMP), max(TIMESTAMP) 
from myTable 
group by KEY 
some_magic_function(max(15 minutes)) 

KEY   sum(VALUE)   min(TIMESTAMP)   max(TIMESTAMP) 
-------------- ---------- ----------------------- ----------------------- 
0F8CE962    2700   20141124054503   20141124110720 
0F8CE962    900   20141125051641   20141125054112 

这可能吗?

+0

什么是TIMESTAMP的格式?如果是YYYYMMDDHH24MISS则05:45:03 <11:07:20超过15分钟 – Multisync 2014-12-04 15:26:02

+0

是的,它是YYYYMMDDHH24miss。请注意,最后两行是11/25,以前是11/24 :-) – morbidflame 2014-12-04 16:18:20

回答

1

您可以使用其他地方演示的“组的开始”方法。应用于您的示例并假定时间戳已经或可以转换为数字值:

with mytable1 as 
    (select mytable.* 
     , case 
      when lag(timestamp, 1, timestamp-150001) over 
        (partition by key order by timestamp) < timestamp-150000 
      then 1 
      else 0 
      end start_of_group 
    from mytable) 
, mytable2 as 
    (select mytable1.* 
     , sum(start_of_group) over (partition by key order by timestamp) grp 
    from mytable1) 
select key 
    , sum(value) 
    , min(timestamp) 
    , max(timestamp) 
from mytable2 
group by key 
     , grp 
order by key 
     , min(timestamp)