回答

收藏

查询一段时间内的DAU / MAU

技术问答 技术问答 400 人阅读 | 0 人回复 | 2023-09-14

我有一个带有session_user_id和date的每日会话表。我想每天绘制出DAU / MAU(每日活跃用户/每月活跃用户)的图表。例如:2 [( E. C$ }. r2 a$ m9 K" A* B
Date         MAU      DAU     DAU/MAU! A' c) ~& {5 d2 l; R
2014-06-01   20,000   5,000   20%
; a1 w9 ?6 Z& d) l6 C  u! b8 h: O2014-06-02   21,000   4,000   19%7 x7 r7 K% e3 m9 J
2014-06-03   20,050   3,050   17%' |2 i9 O& n6 W
...          ...      ...     ...
! i/ J5 P( U. g) J. a0 j' E; f计算每日活动量很容易直接计算,但是计算每月活动量(例如,登录日期为30天的用户数)会引起问题。每天没有左加入怎么办?* W0 Q2 [4 F7 U* _  N( [
编辑:我正在使用Postgres。5 _% ]" x; T1 i
                8 A4 `5 d$ M( ]
解决方案:
& w3 C! |9 O+ g4 e+ ~               
2 ]4 A/ w8 Z( L; U; i! ?+ i, U5 Y3 Q& k; s

, l$ T3 q8 p) K4 i                假设您每天都有值,则可以使用子查询和获得总计数range between:4 S' A) ?- B* c/ i
with dau as (: _' B% O- s% h9 X  A
      select date, count(userid) as dau: z& g6 f* }7 J2 r( s" `
      from dailysessions ds
/ o: o- x6 q5 S/ B      group by date
* k. J* j$ q, F3 g; O( l0 K     )
$ B" Y9 W0 i! w% Nselect date, dau,8 {; S+ I' O' L1 f, a3 t
       sum(dau) over (order by date rows between -29 preceding and current row) as mau
7 }4 X  k1 P  w% g% T, x* a5 y) ufrom dau;
6 g9 {1 ]) Z: C+ o6 h不幸的是,我认为您想要的是不同的用户,而不仅仅是用户数。这使问题变得更加困难,尤其是因为Postgres不支持count(distinct)作为窗口函数。# k1 l8 Z6 }4 s4 j
我认为您必须为此进行某种形式的自我加入。这是一种方法:
" c6 N8 ]% w+ [4 j+ P6 uwith dau as (
' B% G) Z2 c  w) L! s7 L. f# h      select date, count(distinct userid) as dau0 j. \  N4 V& O
      from dailysessions ds# d* V( v1 m2 l; P  `, W- _
      group by date
$ y/ @: C2 l% D( }7 b! l     )5 N, q: n0 y, |
select date, dau,
! _' B% _7 P0 C: c1 i6 k0 G( x8 O       (select count(distinct user_id)7 H# }5 ^6 c" `3 V2 P% J; T+ v
        from dailysessions ds/ R1 u1 w: q: F  ~% H6 l
        where ds.date between date - 29 * interval '1 day' and date3 T. ?4 x. K3 g3 @
       ) as mau8 e) Q0 w9 |' S1 p) T! |
from dau;
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则