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