その日までの通算のUU数
「通算
」が、どのような演算や集計方法で
ご提示の値になるのか解釈に悩みましたけど
推理すると以下のようなことでしょうか。
マスタではなく、トランザクションテーブルにおいて
固有のuser_id
が初めて登場した年月( サンプルデータでは日
ですが )を
user_id
の「登録日
」と見なして
( 過去月を含む )当日までの新規user_id
の総数( 累計 )を計算したい。
カウントしたいのはあくまで新規
なので
過去日に登場したuser_id
は当日に再度現れてもカウントしない。
# 実績のあるuser_id
の個体数を算出したいのではないか、と推測
また、初回登録された日にuser_id
がユニークな値にならないのは
実際は、同日に複数のアクション( 商品購入など )が発生していたりするのでしょう。
ひょっとするとdate
も「時刻
」が切り捨てられていて
元のdate
は別の値なのかもしれませんね。
##更に追記:
シンプルにできたかも。※ver9.4
以降
SQL
1SELECT ymd 年月日
2 , count( distinct user_id ) 日別UU
3 , sum( count( distinct user_id ) filter( where ymd = f ) )
4 over( order by ymd ) 通算UU
5FROM
6(
7 SELECT tx."date" ymd
8 , user_id
9 , min( tx."date" ) over( partition by user_id ) f
10 FROM tx
11) q
12GROUP BY ymd ;
##追記:
新規登録のuser_id
が存在しない日でも
日別UU と 通算UU が両方とも表示されるよう外部結合を適用。
SQL
1CREATE TABLE tx
2(
3 id serial primary key
4 , user_id int not null
5 , "date" date not null
6);
7
8INSERT INTO tx
9 ( user_id, "date" )
10VALUES
11 ( 1, '1970-01-01' )
12 , ( 1, '1970-01-01' )
13 , ( 2, '1970-01-01' )
14 , ( 3, '1970-01-01' )
15 , ( 4, '1970-01-02' )
16 , ( 5, '1970-01-02' )
17 , ( 1, '1970-01-02' )
18 , ( 2, '1970-01-03' )
19 , ( 6, '1970-01-03' )
20 , ( 2, '1970-01-04' )
21 , ( 2, '1970-01-04' )
22 , ( 3, '1970-01-05' )
23 , ( 7, '1970-01-06' )
24;
25
26SELECT x.ymd 年月日
27 , x.duu 日別UU
28 , max( y.tuu ) over( order by x.ymd ) 通算UU
29FROM
30(
31 SELECT tx."date" ymd
32 , count( distinct user_id ) duu
33 FROM tx
34 GROUP BY tx."date"
35) x
36LEFT JOIN
37(
38 SELECT DISTINCT
39 ymd
40 , count(1) over( order by ymd ) tuu
41 FROM
42 (
43 SELECT min( tx."date" ) ymd
44 FROM tx
45 GROUP BY user_id
46 ) q
47) y
48USING ( ymd )
49;
推理が当たっていた場合に限りますけど
通算UU
をわかりやすく計算するのなら ←そんなことは無かった
以下のような3段のクエリ
になりそうです。
SQL
1SELECT 年月
2 , sum( 新規uid数 )
3 over( order by 年月
4 rows between unbounded preceding and current row
5 ) 通算UU
6FROM
7(
8 SELECT 年月
9 , count(1) 新規uid数
10 FROM
11 (
12 SELECT user_id
13 , min( t."date" ) 年月
14 FROM テーブル名 t
15 GROUP BY user_id
16 ) q2
17 GROUP BY 年月
18) q1
19;