我有一个带有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;