Zakładając, że masz wartości dla każdego dnia, możesz uzyskać łączną liczbę za pomocą podzapytania i 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;
Niestety uważam, że potrzebujesz odrębnych użytkowników, a nie tylko liczby użytkowników. To sprawia, że problem jest znacznie trudniejszy, zwłaszcza że Postgres nie obsługuje count(distinct)
jako funkcja okna.
Myślę, że w tym celu musisz zrobić coś w rodzaju samodzielnego przyłączenia się. Oto jedna metoda:
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;