sql >> Base de Datos >  >> RDS >> Oracle

Recuentos distintos diarios continuos

Lo primero que debe hacer es generar una lista de los días que le interesan:

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

Esto generará una tabla de fechas desde el 01-ENE de este año hasta hoy. Une tu tabla a esta subconsulta. El uso de una combinación cruzada puede no ser particularmente eficiente, según la cantidad de datos que tenga en el rango. Por lo tanto, considere esto como una prueba de concepto y realice los ajustes necesarios.

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
/