Oracle
 sql >> Datenbank >  >> RDS >> Oracle

Rollierende tägliche eindeutige Zählungen

Als erstes müssen Sie eine Liste der Tage erstellen, an denen Sie interessiert sind:

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

Dadurch wird eine Datumstabelle vom 01. Januar dieses Jahres bis heute erstellt. Verbinden Sie Ihre Tabelle mit dieser Unterabfrage. Die Verwendung eines Cross Joins ist möglicherweise nicht besonders effizient, je nachdem, wie viele Daten Sie im Bereich haben. Betrachten Sie dies also bitte als Proof of Concept und passen Sie es nach Bedarf an.

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
/