回答

收藏

查询一段时间内的DAU / MAU

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

我有一个带有session_user_id和date的每日会话表。我想每天绘制出DAU / MAU(每日活跃用户/每月活跃用户)的图表。例如:0 W6 x, t6 S- z# h2 ?/ u: n
Date         MAU      DAU     DAU/MAU
  C3 b/ q7 p+ j$ J2014-06-01   20,000   5,000   20%
3 K, X+ e3 z8 H3 W9 b2014-06-02   21,000   4,000   19%
8 O* C& c; v6 |2014-06-03   20,050   3,050   17%3 f) k, q* x, b' S+ v
...          ...      ...     ...
. `& X( v$ m$ M" V: t, L5 C计算每日活动量很容易直接计算,但是计算每月活动量(例如,登录日期为30天的用户数)会引起问题。每天没有左加入怎么办?
5 K4 s/ W& l/ U, F* L编辑:我正在使用Postgres。' e" ]3 x9 k$ c! R" V
               
2 ?5 ]: n: ~0 @( \) Y8 W解决方案:
: T$ E/ i( s0 }$ y9 ~- z! H3 c               
. i1 w% W9 U4 S! M8 y2 K. |7 X: ?" }

' x/ D* F+ q& e7 c& g9 ?                假设您每天都有值,则可以使用子查询和获得总计数range between:7 @% v4 g+ I  u4 |
with dau as (0 R" R! h: E# w3 `! n1 p0 C* E
      select date, count(userid) as dau5 k0 c# d9 ]" V: O2 \2 }6 [# ~
      from dailysessions ds9 u0 |& D6 W# L1 X0 a
      group by date! c0 t- e; u5 T$ A( `% c% R! u
     )- ]; S* J9 X! J& p9 w
select date, dau,& [; C0 R' R5 J5 d2 U
       sum(dau) over (order by date rows between -29 preceding and current row) as mau  T0 V* h9 M+ W6 d+ |
from dau;) R0 `# s6 H$ I* ~& U
不幸的是,我认为您想要的是不同的用户,而不仅仅是用户数。这使问题变得更加困难,尤其是因为Postgres不支持count(distinct)作为窗口函数。9 F2 q1 q# e& k2 l" q
我认为您必须为此进行某种形式的自我加入。这是一种方法:5 o6 x" q6 S' X. P
with dau as (
. j! ]% @) d( A0 y/ k, I      select date, count(distinct userid) as dau3 K  B) @( {2 m/ x9 {6 q% B4 E( |
      from dailysessions ds
& s) ]& G  |% J+ F7 K5 I) A0 M      group by date6 y" M% ~! u& x' Q3 [# s
     )
& V8 T8 |3 P/ @5 [# Y  |3 ~select date, dau,  c' j% v, z! L1 ?
       (select count(distinct user_id)/ ?; s0 K6 p# c. i: K  z
        from dailysessions ds4 a8 a  n1 F9 [, R) J
        where ds.date between date - 29 * interval '1 day' and date" ~7 S& G4 q, U/ L+ D- a
       ) as mau; L& e! G' R4 w* p, B
from dau;
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则