Oracle 10g: как агрегировать по разнице дат

Привет, есть следующие данные:

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

Является ли это возможным?

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)
Другие вопросы по тегам