回答編集履歴
13
SQL文の修正
test
CHANGED
@@ -40,7 +40,7 @@
|
|
40
40
|
|
41
41
|
##更に追記:
|
42
42
|
|
43
|
-
シンプルにできたかも。`
|
43
|
+
シンプルにできたかも。※ver`9.4`以降
|
44
44
|
|
45
45
|
```SQL
|
46
46
|
|
@@ -48,7 +48,7 @@
|
|
48
48
|
|
49
49
|
, count( distinct user_id ) 日別UU
|
50
50
|
|
51
|
-
, sum( count( distinct
|
51
|
+
, sum( count( distinct user_id ) filter( where ymd = f ) )
|
52
52
|
|
53
53
|
over( order by ymd ) 通算UU
|
54
54
|
|
@@ -60,7 +60,7 @@
|
|
60
60
|
|
61
61
|
, user_id
|
62
62
|
|
63
|
-
, min( tx."date" ) over
|
63
|
+
, min( tx."date" ) over( partition by user_id ) f
|
64
64
|
|
65
65
|
FROM tx
|
66
66
|
|
@@ -128,7 +128,7 @@
|
|
128
128
|
|
129
129
|
, ( 7, '1970-01-06' )
|
130
130
|
|
131
|
-
|
131
|
+
;
|
132
132
|
|
133
133
|
|
134
134
|
|
12
SQLの条件表記を略すことにした
test
CHANGED
@@ -48,7 +48,7 @@
|
|
48
48
|
|
49
49
|
, count( distinct user_id ) 日別UU
|
50
50
|
|
51
|
-
, sum( count( distinct case when ymd = f then user_id e
|
51
|
+
, sum( count( distinct case when ymd = f then user_id end ) )
|
52
52
|
|
53
53
|
over( order by ymd ) 通算UU
|
54
54
|
|
11
SQL文中のミスを修正
test
CHANGED
@@ -46,7 +46,7 @@
|
|
46
46
|
|
47
47
|
SELECT ymd 年月日
|
48
48
|
|
49
|
-
, count( distinct
|
49
|
+
, count( distinct user_id ) 日別UU
|
50
50
|
|
51
51
|
, sum( count( distinct case when ymd = f then user_id else null end ) )
|
52
52
|
|
10
SQLのロジックを追記
test
CHANGED
@@ -38,6 +38,40 @@
|
|
38
38
|
|
39
39
|
|
40
40
|
|
41
|
+
##更に追記:
|
42
|
+
|
43
|
+
シンプルにできたかも。`id`も使わない。
|
44
|
+
|
45
|
+
```SQL
|
46
|
+
|
47
|
+
SELECT ymd 年月日
|
48
|
+
|
49
|
+
, count( distinct ymd ) 日別UU
|
50
|
+
|
51
|
+
, sum( count( distinct case when ymd = f then user_id else null end ) )
|
52
|
+
|
53
|
+
over( order by ymd ) 通算UU
|
54
|
+
|
55
|
+
FROM
|
56
|
+
|
57
|
+
(
|
58
|
+
|
59
|
+
SELECT tx."date" ymd
|
60
|
+
|
61
|
+
, user_id
|
62
|
+
|
63
|
+
, min( tx."date" ) over ( partition by user_id ) f
|
64
|
+
|
65
|
+
FROM tx
|
66
|
+
|
67
|
+
) q
|
68
|
+
|
69
|
+
GROUP BY ymd ;
|
70
|
+
|
71
|
+
```
|
72
|
+
|
73
|
+
|
74
|
+
|
41
75
|
##追記:
|
42
76
|
|
43
77
|
新規登録の`user_id`が存在しない日でも
|
9
SQLを極力シンプルな記述に変更
test
CHANGED
@@ -24,6 +24,8 @@
|
|
24
24
|
|
25
25
|
過去日に登場した`user_id`は当日に再度現れてもカウントしない。
|
26
26
|
|
27
|
+
# 実績のある`user_id`の個体数を算出したいのではないか、と推測
|
28
|
+
|
27
29
|
|
28
30
|
|
29
31
|
また、初回登録された日に`user_id`がユニークな値にならないのは
|
@@ -38,11 +40,9 @@
|
|
38
40
|
|
39
41
|
##追記:
|
40
42
|
|
41
|
-
あまり良い記述とは思えませんけど
|
42
|
-
|
43
43
|
新規登録の`user_id`が存在しない日でも
|
44
44
|
|
45
|
-
日別UU と 通算UU が両方とも表示されるよう
|
45
|
+
日別UU と 通算UU が両方とも表示されるよう外部結合を適用。
|
46
46
|
|
47
47
|
|
48
48
|
|
@@ -98,136 +98,104 @@
|
|
98
98
|
|
99
99
|
|
100
100
|
|
101
|
+
SELECT x.ymd 年月日
|
102
|
+
|
103
|
+
, x.duu 日別UU
|
104
|
+
|
101
|
-
|
105
|
+
, max( y.tuu ) over( order by x.ymd ) 通算UU
|
106
|
+
|
102
|
-
|
107
|
+
FROM
|
108
|
+
|
103
|
-
(
|
109
|
+
(
|
110
|
+
|
104
|
-
|
111
|
+
SELECT tx."date" ymd
|
112
|
+
|
113
|
+
, count( distinct user_id ) duu
|
114
|
+
|
115
|
+
FROM tx
|
116
|
+
|
117
|
+
GROUP BY tx."date"
|
118
|
+
|
119
|
+
) x
|
120
|
+
|
121
|
+
LEFT JOIN
|
122
|
+
|
123
|
+
(
|
124
|
+
|
105
|
-
SELECT
|
125
|
+
SELECT DISTINCT
|
126
|
+
|
106
|
-
|
127
|
+
ymd
|
128
|
+
|
107
|
-
,
|
129
|
+
, count(1) over( order by ymd ) tuu
|
108
|
-
|
109
|
-
, x.uu
|
110
130
|
|
111
131
|
FROM
|
112
132
|
|
113
133
|
(
|
114
134
|
|
115
|
-
SELECT tx."date" ymd
|
135
|
+
SELECT min( tx."date" ) ymd
|
116
|
-
|
117
|
-
, count( distinct user_id ) uu
|
118
136
|
|
119
137
|
FROM tx
|
120
138
|
|
121
|
-
GROUP BY
|
139
|
+
GROUP BY user_id
|
122
|
-
|
140
|
+
|
123
|
-
)
|
141
|
+
) q
|
142
|
+
|
124
|
-
|
143
|
+
) y
|
144
|
+
|
145
|
+
USING ( ymd )
|
146
|
+
|
147
|
+
;
|
148
|
+
|
149
|
+
```
|
150
|
+
|
151
|
+
|
152
|
+
|
153
|
+
推理が当たっていた場合に限りますけど
|
154
|
+
|
155
|
+
~~`通算UU`をわかりやすく計算するのなら~~ ←そんなことは無かった
|
156
|
+
|
157
|
+
以下のような`3段のクエリ`になりそうです。
|
158
|
+
|
159
|
+
|
160
|
+
|
161
|
+
```SQL
|
162
|
+
|
125
|
-
|
163
|
+
SELECT 年月
|
164
|
+
|
165
|
+
, sum( 新規uid数 )
|
166
|
+
|
167
|
+
over( order by 年月
|
168
|
+
|
169
|
+
rows between unbounded preceding and current row
|
170
|
+
|
171
|
+
) 通算UU
|
172
|
+
|
173
|
+
FROM
|
174
|
+
|
175
|
+
(
|
176
|
+
|
177
|
+
SELECT 年月
|
178
|
+
|
179
|
+
, count(1) 新規uid数
|
180
|
+
|
181
|
+
FROM
|
126
182
|
|
127
183
|
(
|
128
184
|
|
129
|
-
SELECT DISTINCT min( tx."date" ) ymd
|
130
|
-
|
131
|
-
FROM tx
|
132
|
-
|
133
|
-
|
185
|
+
SELECT user_id
|
134
|
-
|
135
|
-
|
186
|
+
|
136
|
-
|
137
|
-
ON x.ymd = y.ymd
|
138
|
-
|
139
|
-
),
|
140
|
-
|
141
|
-
m2 ( ymd2, 通算UU ) AS
|
142
|
-
|
143
|
-
(
|
144
|
-
|
145
|
-
SELECT DISTINCT
|
146
|
-
|
147
|
-
ymd
|
148
|
-
|
149
|
-
, count(1) over( order by ymd )
|
150
|
-
|
151
|
-
FROM
|
152
|
-
|
153
|
-
(
|
154
|
-
|
155
|
-
|
187
|
+
, min( t."date" ) 年月
|
156
|
-
|
188
|
+
|
157
|
-
FROM t
|
189
|
+
FROM テーブル名 t
|
158
190
|
|
159
191
|
GROUP BY user_id
|
160
192
|
|
161
|
-
) q
|
193
|
+
) q2
|
162
|
-
|
163
|
-
|
194
|
+
|
164
|
-
|
165
|
-
SELECT m1.ymd1 年月日
|
166
|
-
|
167
|
-
, m1.日別UU
|
168
|
-
|
169
|
-
, m2.通算UU
|
170
|
-
|
171
|
-
FROM m1
|
172
|
-
|
173
|
-
JOIN m2
|
174
|
-
|
175
|
-
USING ( ymd2 )
|
176
|
-
|
177
|
-
O
|
195
|
+
GROUP BY 年月
|
196
|
+
|
197
|
+
) q1
|
178
198
|
|
179
199
|
;
|
180
200
|
|
181
201
|
```
|
182
|
-
|
183
|
-
|
184
|
-
|
185
|
-
推理が当たっていた場合に限りますけど
|
186
|
-
|
187
|
-
~~`通算UU`をわかりやすく計算するのなら~~ ←そんなことは無かった
|
188
|
-
|
189
|
-
以下のような`3段のクエリ`になりそうです。
|
190
|
-
|
191
|
-
|
192
|
-
|
193
|
-
```SQL
|
194
|
-
|
195
|
-
SELECT 年月
|
196
|
-
|
197
|
-
, sum( 新規uid数 )
|
198
|
-
|
199
|
-
over( order by 年月
|
200
|
-
|
201
|
-
rows between unbounded preceding and current row
|
202
|
-
|
203
|
-
) 通算UU
|
204
|
-
|
205
|
-
FROM
|
206
|
-
|
207
|
-
(
|
208
|
-
|
209
|
-
SELECT 年月
|
210
|
-
|
211
|
-
, count(1) 新規uid数
|
212
|
-
|
213
|
-
FROM
|
214
|
-
|
215
|
-
(
|
216
|
-
|
217
|
-
SELECT user_id
|
218
|
-
|
219
|
-
, min( t."date" ) 年月
|
220
|
-
|
221
|
-
FROM テーブル名 t
|
222
|
-
|
223
|
-
GROUP BY user_id
|
224
|
-
|
225
|
-
) q2
|
226
|
-
|
227
|
-
GROUP BY 年月
|
228
|
-
|
229
|
-
) q1
|
230
|
-
|
231
|
-
;
|
232
|
-
|
233
|
-
```
|
8
SQL文中のゴミを削除
test
CHANGED
@@ -104,7 +104,7 @@
|
|
104
104
|
|
105
105
|
SELECT x.ymd
|
106
106
|
|
107
|
-
,
|
107
|
+
, max( y.ymd ) over ( order by x.ymd )
|
108
108
|
|
109
109
|
, x.uu
|
110
110
|
|
7
test
CHANGED
@@ -152,84 +152,82 @@
|
|
152
152
|
|
153
153
|
(
|
154
154
|
|
155
|
+
SELECT min( tx."date" ) ymd
|
156
|
+
|
157
|
+
FROM tx
|
158
|
+
|
159
|
+
GROUP BY user_id
|
160
|
+
|
161
|
+
) q
|
162
|
+
|
163
|
+
)
|
164
|
+
|
165
|
+
SELECT m1.ymd1 年月日
|
166
|
+
|
167
|
+
, m1.日別UU
|
168
|
+
|
169
|
+
, m2.通算UU
|
170
|
+
|
171
|
+
FROM m1
|
172
|
+
|
173
|
+
JOIN m2
|
174
|
+
|
175
|
+
USING ( ymd2 )
|
176
|
+
|
177
|
+
ORDER BY 1
|
178
|
+
|
179
|
+
;
|
180
|
+
|
181
|
+
```
|
182
|
+
|
183
|
+
|
184
|
+
|
185
|
+
推理が当たっていた場合に限りますけど
|
186
|
+
|
187
|
+
~~`通算UU`をわかりやすく計算するのなら~~ ←そんなことは無かった
|
188
|
+
|
189
|
+
以下のような`3段のクエリ`になりそうです。
|
190
|
+
|
191
|
+
|
192
|
+
|
193
|
+
```SQL
|
194
|
+
|
195
|
+
SELECT 年月
|
196
|
+
|
197
|
+
, sum( 新規uid数 )
|
198
|
+
|
199
|
+
over( order by 年月
|
200
|
+
|
201
|
+
rows between unbounded preceding and current row
|
202
|
+
|
203
|
+
) 通算UU
|
204
|
+
|
205
|
+
FROM
|
206
|
+
|
207
|
+
(
|
208
|
+
|
209
|
+
SELECT 年月
|
210
|
+
|
211
|
+
, count(1) 新規uid数
|
212
|
+
|
213
|
+
FROM
|
214
|
+
|
215
|
+
(
|
216
|
+
|
155
217
|
SELECT user_id
|
156
218
|
|
157
|
-
, min( t
|
219
|
+
, min( t."date" ) 年月
|
158
|
-
|
220
|
+
|
159
|
-
FROM t
|
221
|
+
FROM テーブル名 t
|
160
222
|
|
161
223
|
GROUP BY user_id
|
162
224
|
|
163
|
-
) q
|
225
|
+
) q2
|
164
|
-
|
165
|
-
|
226
|
+
|
166
|
-
|
167
|
-
SELECT m1.ymd1 年月日
|
168
|
-
|
169
|
-
, m1.日別UU
|
170
|
-
|
171
|
-
, m2.通算UU
|
172
|
-
|
173
|
-
FROM m1
|
174
|
-
|
175
|
-
JOIN m2
|
176
|
-
|
177
|
-
USING ( ymd2 )
|
178
|
-
|
179
|
-
O
|
227
|
+
GROUP BY 年月
|
228
|
+
|
229
|
+
) q1
|
180
230
|
|
181
231
|
;
|
182
232
|
|
183
233
|
```
|
184
|
-
|
185
|
-
|
186
|
-
|
187
|
-
推理が当たっていた場合に限りますけど
|
188
|
-
|
189
|
-
~~`通算UU`をわかりやすく計算するのなら~~ ←そんなことは無かった
|
190
|
-
|
191
|
-
以下のような`3段のクエリ`になりそうです。
|
192
|
-
|
193
|
-
|
194
|
-
|
195
|
-
```SQL
|
196
|
-
|
197
|
-
SELECT 年月
|
198
|
-
|
199
|
-
, sum( 新規uid数 )
|
200
|
-
|
201
|
-
over( order by 年月
|
202
|
-
|
203
|
-
rows between unbounded preceding and current row
|
204
|
-
|
205
|
-
) 通算UU
|
206
|
-
|
207
|
-
FROM
|
208
|
-
|
209
|
-
(
|
210
|
-
|
211
|
-
SELECT 年月
|
212
|
-
|
213
|
-
, count(1) 新規uid数
|
214
|
-
|
215
|
-
FROM
|
216
|
-
|
217
|
-
(
|
218
|
-
|
219
|
-
SELECT user_id
|
220
|
-
|
221
|
-
, min( t."date" ) 年月
|
222
|
-
|
223
|
-
FROM テーブル名 t
|
224
|
-
|
225
|
-
GROUP BY user_id
|
226
|
-
|
227
|
-
) q2
|
228
|
-
|
229
|
-
GROUP BY 年月
|
230
|
-
|
231
|
-
) q1
|
232
|
-
|
233
|
-
;
|
234
|
-
|
235
|
-
```
|
6
test
CHANGED
@@ -186,7 +186,7 @@
|
|
186
186
|
|
187
187
|
推理が当たっていた場合に限りますけど
|
188
188
|
|
189
|
-
`通算UU`をわかりやすく計算するのなら
|
189
|
+
~~`通算UU`をわかりやすく計算するのなら~~ ←そんなことは無かった
|
190
190
|
|
191
191
|
以下のような`3段のクエリ`になりそうです。
|
192
192
|
|
5
SQL文の修正
test
CHANGED
@@ -98,7 +98,7 @@
|
|
98
98
|
|
99
99
|
|
100
100
|
|
101
|
-
WITH m
|
101
|
+
WITH m1 ( ymd1, ymd2, 日別UU ) AS
|
102
102
|
|
103
103
|
(
|
104
104
|
|
@@ -106,14 +106,20 @@
|
|
106
106
|
|
107
107
|
, coalesce( y.ymd, max( y.ymd ) over ( order by x.ymd ) )
|
108
108
|
|
109
|
+
, x.uu
|
110
|
+
|
109
111
|
FROM
|
110
112
|
|
111
113
|
(
|
112
114
|
|
113
|
-
SELECT
|
115
|
+
SELECT tx."date" ymd
|
116
|
+
|
117
|
+
, count( distinct user_id ) uu
|
114
118
|
|
115
119
|
FROM tx
|
116
120
|
|
121
|
+
GROUP BY tx."date"
|
122
|
+
|
117
123
|
) x
|
118
124
|
|
119
125
|
LEFT JOIN
|
@@ -132,20 +138,6 @@
|
|
132
138
|
|
133
139
|
),
|
134
140
|
|
135
|
-
m1 ( ymd1, 日別UU ) AS
|
136
|
-
|
137
|
-
(
|
138
|
-
|
139
|
-
SELECT tx."date"
|
140
|
-
|
141
|
-
, count( distinct user_id )
|
142
|
-
|
143
|
-
FROM tx
|
144
|
-
|
145
|
-
GROUP BY tx."date"
|
146
|
-
|
147
|
-
),
|
148
|
-
|
149
141
|
m2 ( ymd2, 通算UU ) AS
|
150
142
|
|
151
143
|
(
|
@@ -172,21 +164,17 @@
|
|
172
164
|
|
173
165
|
)
|
174
166
|
|
175
|
-
SELECT m
|
167
|
+
SELECT m1.ymd1 年月日
|
176
168
|
|
177
169
|
, m1.日別UU
|
178
170
|
|
179
171
|
, m2.通算UU
|
180
172
|
|
181
|
-
FROM m
|
173
|
+
FROM m1
|
182
|
-
|
183
|
-
|
174
|
+
|
184
|
-
|
185
|
-
ON m0.ymd1 = m1.ymd1
|
186
|
-
|
187
|
-
JOIN m2
|
175
|
+
JOIN m2
|
188
|
-
|
176
|
+
|
189
|
-
|
177
|
+
USING ( ymd2 )
|
190
178
|
|
191
179
|
ORDER BY 1
|
192
180
|
|
4
SQL文の修正
test
CHANGED
@@ -104,7 +104,7 @@
|
|
104
104
|
|
105
105
|
SELECT x.ymd
|
106
106
|
|
107
|
-
, max( y.ymd )
|
107
|
+
, coalesce( y.ymd, max( y.ymd ) over ( order by x.ymd ) )
|
108
108
|
|
109
109
|
FROM
|
110
110
|
|
@@ -128,9 +128,7 @@
|
|
128
128
|
|
129
129
|
) y
|
130
130
|
|
131
|
-
ON x.ymd
|
131
|
+
ON x.ymd = y.ymd
|
132
|
-
|
133
|
-
GROUP BY x.ymd
|
134
132
|
|
135
133
|
),
|
136
134
|
|
3
結合の欠陥を補正(SQL)
test
CHANGED
@@ -12,11 +12,11 @@
|
|
12
12
|
|
13
13
|
マスタではなく、トランザクションテーブルにおいて
|
14
14
|
|
15
|
-
固有の`user_id`が
|
15
|
+
固有の`user_id`が初めて登場した年月( サンプルデータでは`日`ですが )を
|
16
16
|
|
17
17
|
`user_id`の「`登録日`」と見なして
|
18
18
|
|
19
|
-
( 過去月を含む )当日までの
|
19
|
+
( 過去月を含む )当日までの新規`user_id`の総数( 累計 )を計算したい。
|
20
20
|
|
21
21
|
|
22
22
|
|
@@ -36,11 +36,19 @@
|
|
36
36
|
|
37
37
|
|
38
38
|
|
39
|
+
##追記:
|
40
|
+
|
41
|
+
あまり良い記述とは思えませんけど
|
42
|
+
|
43
|
+
新規登録の`user_id`が存在しない日でも
|
44
|
+
|
45
|
+
日別UU と 通算UU が両方とも表示されるようにはしておきます。
|
46
|
+
|
39
47
|
|
40
48
|
|
41
49
|
```SQL
|
42
50
|
|
43
|
-
CREATE TABLE
|
51
|
+
CREATE TABLE tx
|
44
52
|
|
45
53
|
(
|
46
54
|
|
@@ -54,7 +62,7 @@
|
|
54
62
|
|
55
63
|
|
56
64
|
|
57
|
-
INSERT INTO
|
65
|
+
INSERT INTO tx
|
58
66
|
|
59
67
|
( user_id, "date" )
|
60
68
|
|
@@ -78,33 +86,145 @@
|
|
78
86
|
|
79
87
|
, ( 6, '1970-01-03' )
|
80
88
|
|
89
|
+
, ( 2, '1970-01-04' )
|
90
|
+
|
91
|
+
, ( 2, '1970-01-04' )
|
92
|
+
|
93
|
+
, ( 3, '1970-01-05' )
|
94
|
+
|
95
|
+
, ( 7, '1970-01-06' )
|
96
|
+
|
97
|
+
;
|
98
|
+
|
99
|
+
|
100
|
+
|
101
|
+
WITH m0 ( ymd1, ymd2 ) AS
|
102
|
+
|
103
|
+
(
|
104
|
+
|
105
|
+
SELECT x.ymd
|
106
|
+
|
107
|
+
, max( y.ymd )
|
108
|
+
|
109
|
+
FROM
|
110
|
+
|
111
|
+
(
|
112
|
+
|
113
|
+
SELECT DISTINCT tx."date" ymd
|
114
|
+
|
115
|
+
FROM tx
|
116
|
+
|
117
|
+
) x
|
118
|
+
|
119
|
+
LEFT JOIN
|
120
|
+
|
121
|
+
(
|
122
|
+
|
123
|
+
SELECT DISTINCT min( tx."date" ) ymd
|
124
|
+
|
125
|
+
FROM tx
|
126
|
+
|
127
|
+
GROUP BY user_id
|
128
|
+
|
129
|
+
) y
|
130
|
+
|
131
|
+
ON x.ymd >= y.ymd
|
132
|
+
|
133
|
+
GROUP BY x.ymd
|
134
|
+
|
135
|
+
),
|
136
|
+
|
137
|
+
m1 ( ymd1, 日別UU ) AS
|
138
|
+
|
139
|
+
(
|
140
|
+
|
141
|
+
SELECT tx."date"
|
142
|
+
|
143
|
+
, count( distinct user_id )
|
144
|
+
|
145
|
+
FROM tx
|
146
|
+
|
147
|
+
GROUP BY tx."date"
|
148
|
+
|
149
|
+
),
|
150
|
+
|
151
|
+
m2 ( ymd2, 通算UU ) AS
|
152
|
+
|
153
|
+
(
|
154
|
+
|
155
|
+
SELECT DISTINCT
|
156
|
+
|
157
|
+
ymd
|
158
|
+
|
159
|
+
, count(1) over( order by ymd )
|
160
|
+
|
161
|
+
FROM
|
162
|
+
|
163
|
+
(
|
164
|
+
|
165
|
+
SELECT user_id
|
166
|
+
|
167
|
+
, min( tx."date" ) ymd
|
168
|
+
|
169
|
+
FROM tx
|
170
|
+
|
171
|
+
GROUP BY user_id
|
172
|
+
|
173
|
+
) q
|
174
|
+
|
175
|
+
)
|
176
|
+
|
177
|
+
SELECT m0.ymd1 年月日
|
178
|
+
|
179
|
+
, m1.日別UU
|
180
|
+
|
181
|
+
, m2.通算UU
|
182
|
+
|
183
|
+
FROM m0
|
184
|
+
|
185
|
+
JOIN m1
|
186
|
+
|
187
|
+
ON m0.ymd1 = m1.ymd1
|
188
|
+
|
189
|
+
JOIN m2
|
190
|
+
|
191
|
+
ON m0.ymd2 = m2.ymd2
|
192
|
+
|
193
|
+
ORDER BY 1
|
194
|
+
|
81
195
|
;
|
82
196
|
|
83
|
-
|
197
|
+
```
|
198
|
+
|
199
|
+
|
200
|
+
|
84
|
-
|
201
|
+
推理が当たっていた場合に限りますけど
|
202
|
+
|
203
|
+
`通算UU`をわかりやすく計算するのなら
|
204
|
+
|
205
|
+
以下のような`3段のクエリ`になりそうです。
|
206
|
+
|
207
|
+
|
208
|
+
|
209
|
+
```SQL
|
210
|
+
|
211
|
+
SELECT 年月
|
212
|
+
|
85
|
-
|
213
|
+
, sum( 新規uid数 )
|
214
|
+
|
86
|
-
|
215
|
+
over( order by 年月
|
216
|
+
|
217
|
+
rows between unbounded preceding and current row
|
218
|
+
|
219
|
+
) 通算UU
|
220
|
+
|
221
|
+
FROM
|
222
|
+
|
87
|
-
(
|
223
|
+
(
|
88
|
-
|
89
|
-
|
224
|
+
|
90
|
-
|
91
|
-
, count( distinct user_id )
|
92
|
-
|
93
|
-
FROM テーブル名 t
|
94
|
-
|
95
|
-
GROUP BY t."date"
|
96
|
-
|
97
|
-
),
|
98
|
-
|
99
|
-
y ( 年月日, 通算UU ) AS
|
100
|
-
|
101
|
-
(
|
102
|
-
|
103
|
-
SELECT
|
225
|
+
SELECT 年月
|
104
|
-
|
105
|
-
|
226
|
+
|
106
|
-
|
107
|
-
, count(1)
|
227
|
+
, count(1) 新規uid数
|
108
228
|
|
109
229
|
FROM
|
110
230
|
|
@@ -112,84 +232,18 @@
|
|
112
232
|
|
113
233
|
SELECT user_id
|
114
234
|
|
115
|
-
, min( t."date" )
|
235
|
+
, min( t."date" ) 年月
|
116
236
|
|
117
237
|
FROM テーブル名 t
|
118
238
|
|
119
239
|
GROUP BY user_id
|
120
240
|
|
121
|
-
) q
|
241
|
+
) q2
|
122
|
-
|
123
|
-
|
242
|
+
|
124
|
-
|
125
|
-
|
126
|
-
|
127
|
-
SELECT x.年月日
|
128
|
-
|
129
|
-
, x.日別UU
|
130
|
-
|
131
|
-
, y.通算UU
|
132
|
-
|
133
|
-
FROM x
|
134
|
-
|
135
|
-
JOIN y
|
136
|
-
|
137
|
-
USING ( 年月日 )
|
138
|
-
|
139
|
-
O
|
243
|
+
GROUP BY 年月
|
244
|
+
|
245
|
+
) q1
|
140
246
|
|
141
247
|
;
|
142
248
|
|
143
249
|
```
|
144
|
-
|
145
|
-
|
146
|
-
|
147
|
-
推理が当たっていた場合に限りますけど
|
148
|
-
|
149
|
-
`通算UU`をわかりやすく計算するのなら
|
150
|
-
|
151
|
-
以下のような`3段のクエリ`になりそうです。
|
152
|
-
|
153
|
-
|
154
|
-
|
155
|
-
```SQL
|
156
|
-
|
157
|
-
SELECT 年月
|
158
|
-
|
159
|
-
, sum( 新規uid数 )
|
160
|
-
|
161
|
-
over( order by 年月
|
162
|
-
|
163
|
-
rows between unbounded preceding and current row
|
164
|
-
|
165
|
-
) 通算UU
|
166
|
-
|
167
|
-
FROM
|
168
|
-
|
169
|
-
(
|
170
|
-
|
171
|
-
SELECT 年月
|
172
|
-
|
173
|
-
, count(1) 新規uid数
|
174
|
-
|
175
|
-
FROM
|
176
|
-
|
177
|
-
(
|
178
|
-
|
179
|
-
SELECT user_id
|
180
|
-
|
181
|
-
, min( t."date" ) 年月
|
182
|
-
|
183
|
-
FROM テーブル名 t
|
184
|
-
|
185
|
-
GROUP BY user_id
|
186
|
-
|
187
|
-
) q2
|
188
|
-
|
189
|
-
GROUP BY 年月
|
190
|
-
|
191
|
-
) q1
|
192
|
-
|
193
|
-
;
|
194
|
-
|
195
|
-
```
|
2
文章中の紛らわしい表現を修正
test
CHANGED
@@ -16,17 +16,17 @@
|
|
16
16
|
|
17
17
|
`user_id`の「`登録日`」と見なして
|
18
18
|
|
19
|
-
( 過去月を含む )当
|
19
|
+
( 過去月を含む )当日までの`新規user_id`の総数( 累計 )を計算したい。
|
20
20
|
|
21
21
|
|
22
22
|
|
23
23
|
カウントしたいのはあくまで`新規`なので
|
24
24
|
|
25
|
-
過去
|
25
|
+
過去日に登場した`user_id`は当日に再度現れてもカウントしない。
|
26
26
|
|
27
27
|
|
28
28
|
|
29
|
-
また、初回登録された
|
29
|
+
また、初回登録された日に`user_id`がユニークな値にならないのは
|
30
30
|
|
31
31
|
実際は、同日に複数のアクション( 商品購入など )が発生していたりするのでしょう。
|
32
32
|
|
1
文章におかしな箇所がいくつかあったので修正
test
CHANGED
@@ -12,25 +12,25 @@
|
|
12
12
|
|
13
13
|
マスタではなく、トランザクションテーブルにおいて
|
14
14
|
|
15
|
-
固有の`user_id`が`初めて登場した年月`を
|
15
|
+
固有の`user_id`が`初めて登場した年月`( サンプルデータでは`日`ですが )を
|
16
16
|
|
17
17
|
`user_id`の「`登録日`」と見なして
|
18
18
|
|
19
|
-
( 過去月を含む )当月までの`新規user_id`の総数( 累計 )を計算したい。
|
19
|
+
( 過去月を含む )当月(日)までの`新規user_id`の総数( 累計 )を計算したい。
|
20
20
|
|
21
21
|
|
22
22
|
|
23
23
|
カウントしたいのはあくまで`新規`なので
|
24
24
|
|
25
|
-
過去月に登場した`user_id`は当月に再度現れてもカウントしない。
|
25
|
+
過去月(日)に登場した`user_id`は当月に再度現れてもカウントしない。
|
26
26
|
|
27
27
|
|
28
28
|
|
29
|
-
また、初回登録された月に`user_id`がユニークな値にならないのは
|
29
|
+
また、初回登録された月(日)に`user_id`がユニークな値にならないのは
|
30
30
|
|
31
31
|
実際は、同日に複数のアクション( 商品購入など )が発生していたりするのでしょう。
|
32
32
|
|
33
|
-
ひょっとすると`date`も「`
|
33
|
+
ひょっとすると`date`も「`時刻`」が切り捨てられていて
|
34
34
|
|
35
35
|
元の`date`は別の値なのかもしれませんね。
|
36
36
|
|
@@ -99,8 +99,6 @@
|
|
99
99
|
y ( 年月日, 通算UU ) AS
|
100
100
|
|
101
101
|
(
|
102
|
-
|
103
|
-
|
104
102
|
|
105
103
|
SELECT DISTINCT
|
106
104
|
|