Điều đầu tiên cần làm là tạo danh sách những ngày bạn thấy thú vị:
select (trunc(sysdate, 'yyyy') -1) + level as ts_day
from dual
connect by level <= to_number( to_char(sysdate, 'DDD' ) )
Điều này sẽ tạo ra một bảng ngày từ 01-JAN năm nay đến ngày hôm nay. Tham gia bảng của bạn với truy vấn phụ này. Sử dụng kết hợp chéo có thể không hiệu quả đặc biệt, tùy thuộc vào lượng dữ liệu bạn có trong phạm vi. Vì vậy, hãy coi đây là bằng chứng về khái niệm và điều chỉnh khi bạn cần.
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
/