Supondo que você tenha valores para cada dia, você pode obter as contagens totais usando uma subconsulta e
range between
:with dau as (
select date, count(userid) as dau
from dailysessions ds
group by date
)
select date, dau,
sum(dau) over (order by date rows between -29 preceding and current row) as mau
from dau;
Infelizmente, acho que você quer usuários distintos em vez de apenas contagens de usuários. Isso torna o problema muito mais difícil, especialmente porque o Postgres não suporta
count(distinct)
como uma função de janela. Eu acho que você tem que fazer algum tipo de auto-junção para isso. Aqui está um método:
with dau as (
select date, count(distinct userid) as dau
from dailysessions ds
group by date
)
select date, dau,
(select count(distinct user_id)
from dailysessions ds
where ds.date between date - 29 * interval '1 day' and date
) as mau
from dau;