sql >> Database >  >> RDS >> PostgreSQL

DAU/MAU opvragen in de loop van de tijd (dagelijks)

Ervan uitgaande dat u waarden voor elke dag heeft, kunt u de totale tellingen krijgen met behulp van een subquery en een 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;

Helaas denk ik dat je verschillende gebruikers wilt in plaats van alleen gebruikersaantallen. Dat maakt het probleem veel moeilijker, vooral omdat Postgres geen ondersteuning biedt voor count(distinct) als een vensterfunctie.

Ik denk dat je hiervoor een soort self-join moet doen. Hier is een 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;


  1. Fatale fout:oproep naar niet-gedefinieerde functie sqlsrv_connect()

  2. Gegevensverlies herstellen met behulp van verzending van logbestanden met vertraagd herstel

  3. COALESCE() voor lege (maar niet null) velden

  4. Formulier werkt alleen als u het selectievakje aanklikt