Для одного клиента:
Лучшее решение, которое я могу придумать, - это не использование аналитики, а субфакторные запросы / общие табличные выражения. Oracle, как правило, достаточно умен, чтобы знать, превращать ли их во временную таблицу или нет, что снижает стоимость обработки нескольких передач по одним и тем же данным.
with txns as
(select customer_id
txn_id,
txn_ts
from transaction_table
where customer_id = ?
AND txn_ts >= SYSTIMESTAMP - NUMTODSINTERVAL(10, 'DAY')
)
select customer_id,
(select count(*) from txns
where event_ts >= systimestamp - numtodsinterval(5/1440, 'day'))
as txn_5_min,
(select count(*) from txns
where event_ts >= systimestamp - numtodsinterval(30/1440, 'day'))
as txn_30_min,
(select count(*) from txns
where event_ts >= systimestamp - numtodsinterval(1/24, 'day'))
as txn_1_hour,
(select count(*) from txns
where event_ts >= systimestamp - numtodsinterval(2/24, 'day'))
as txn_2_hour,
(select count(*) from txns
where event_ts >= systimestamp - numtodsinterval(3/24, 'day'))
as txn_3_hour,
(select count(*) from txns
where event_ts >= systimestamp - numtodsinterval(4/24, 'day'))
as txn_4_hour,
(select count(*) from txns
where event_ts >= systimestamp - numtodsinterval(1, 'day'))
as txn_1_day,
(select count(*) from txns
where event_ts >= systimestamp - numtodsinterval(2, 'day'))
as txn_2_day,
(select count(*) from txns
where event_ts >= systimestamp - numtodsinterval(5, 'day'))
as txn_5_day,
(select count(*) from txns
where event_ts >= systimestamp - numtodsinterval(10, 'day'))
as txn_10_day
from customer
WHERE customer_id = ?;
Вы могли бы использовать аналогичную реализацию для случая с несколькими клиентами, хотя эффективность определенно пострадает. Подумайте, будут ли ваши 5-минутные данные уровня устаревшими для всех клиентов к тому времени, как вы закончили их получение.