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)