PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Abfrage von DAU/MAU im Zeitverlauf (täglich)

Angenommen, Sie haben Werte für jeden Tag, können Sie die Gesamtzahlen mit einer Unterabfrage und range between abrufen :

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;

Leider denke ich, dass Sie unterschiedliche Benutzer und nicht nur Benutzerzahlen wollen. Das macht das Problem viel schwieriger, insbesondere weil Postgres count(distinct) nicht unterstützt als Fensterfunktion.

Ich denke, Sie müssen dafür eine Art Selbstverknüpfung durchführen. Hier ist eine Methode:

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;