Oracle
 sql >> Base de données >  >> RDS >> Oracle

Comptes distincts quotidiens roulants

La première chose à faire est de générer une liste des jours qui vous intéressent :

select (trunc(sysdate, 'yyyy') -1) + level as ts_day
from dual
connect by level <= to_number( to_char(sysdate, 'DDD' ) )

Cela générera un tableau des dates du 01-JAN de cette année à aujourd'hui. Joignez votre table à cette sous-requête. L'utilisation d'une jointure croisée peut ne pas être particulièrement efficace, selon la quantité de données que vous avez dans la plage. Veuillez donc considérer cela comme une preuve de concept et ajuster selon vos besoins.

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
/