Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

Contagens Distintas Diárias Rolantes


A primeira coisa a fazer é gerar uma lista dos dias em que você está interessado:
select (trunc(sysdate, 'yyyy') -1) + level as ts_day
from dual
connect by level <= to_number( to_char(sysdate, 'DDD' ) )

Isso irá gerar uma tabela de datas de 01-JAN deste ano até hoje. Junte sua tabela a esta subconsulta. Usar uma junção cruzada pode não ser particularmente eficiente, dependendo da quantidade de dados que você tem no intervalo. Portanto, considere isso como uma prova de conceito e ajuste conforme necessário.
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
/