Та же самая базовая c идея, что и у @MTO, но она использует ваш оригинальный запрос - включая фильтр / лимит - в CTE:
with cte1 (row_num, itemx, device_timestamp) as (
select row_number() over(order by device_timestamp desc),
itemX,
device_timestamp
from tracks_report
where device_timestamp >= sys_extract_utc(systimestamp) - INTERVAL '03:00' HOUR TO MINUTE
and itemX = '9094E4E56CAEF8D7E0531965000A285C'
order by device_timestamp desc
FETCH NEXT 10 ROWS ONLY
)
select row_num,
itemX,
device_timestamp,
device_timestamp
- lead(device_timestamp) over (partition by itemX order by device_timestamp desc)
as diff_interval
from cte1;
И затем вы можете получить разницу из интервалов в секунд с extract()
:
with cte1 (row_num, itemx, device_timestamp) as (
...
),
cte2 (row_num, itemX, device_timestamp, diff_interval) as (
select row_num,
itemX,
device_timestamp,
device_timestamp
- lead(device_timestamp) over (partition by itemX order by device_timestamp desc)
as diff_interval
from cte1
)
select row_num, itemX, device_timestamp, diff_interval,
extract(hour from diff_interval) * 3600
+ extract(minute from diff_interval) * 60
+ extract(second from diff_interval) as diff_seconds
from cte2;
И вместо того, чтобы отображать их все, получите среднее значение:
with cte1 (row_num, itemx, device_timestamp) as (
...
),
cte2 (row_num, itemX, device_timestamp, diff_interval) as (
...
)
select avg(
extract(hour from diff_interval) * 3600
+ extract(minute from diff_interval) * 60
+ extract(second from diff_interval)
) as avg_diff_seconds
from cte2;
AVG_DIFF_SECONDS
----------------
60.7777778
Единственная причина, по которой я до сих пор писал, состоит в том, что он ведет себя по-разному из-за того, где фильтр / предел применяется. При этом рассматривается среднее из 9 интервалов между 10 самыми последними временными метками (если их было много за последние 3 часа). Если вы примените фильтр / предел в конце, тогда он будет включать интервал между 10-м и 11-м, даже если 11-е многократно раньше.
Что правильно, конечно, решать вам, это не так. t совершенно ясно из вопроса.