Първото нещо, което трябва да направите, е да генерирате списък с дните, в които сте интересни:
select (trunc(sysdate, 'yyyy') -1) + level as ts_day
from dual
connect by level <= to_number( to_char(sysdate, 'DDD' ) )
Това ще генерира таблица с дати от 01 януари тази година до днес. Присъединете вашата таблица към тази подзаявка. Използването на кръстосано свързване може да не е особено ефективно в зависимост от това колко данни имате в диапазона. Така че, моля, гледайте на това като на доказателство за концепцията и настройте според нуждите си.
with days as
( select (trunc(sysdate, 'yyyy') -1) + level as ts_day
from dual
connect by level <= to_number( to_char(sysdate, 'DDD' ) ) )
select days.ts_day
, sum ( case when trunc(connect_ts) = ts_day then 1 else 0 end ) as daily_users
, sum ( case when trunc(connect_ts) between ts_day - 45 and ts_day then 1 else 0 end ) as active_users
from days
cross join sessions
where connect_ts between trunc(sysdate, 'yyyy') - 45 and sysdate
group by ts_day
order by ts_day
/