質問するログイン新規登録

回答編集履歴

3

SQL修正

2016/01/21 03:44

投稿

jcs502ulf
jcs502ulf

スコア307

answer CHANGED
@@ -23,4 +23,21 @@
23
23
  group by access_month
24
24
  ) b on a.access_month = b.access_month
25
25
  ```
26
- 分析関数を使えばもっとすっきりするかもしれません。
26
+ 分析関数を使えばもっとすっきりするかもしれません。
27
+
28
+ ---
29
+ 2016/01/21 追記
30
+ left joinより上の部分をdistinctにして重複ユーザーを除去しました。
31
+ ```SQL
32
+ select a.access_month, b.newer_count, a.all_count - b.newer_count as repeater_count
33
+ from (
34
+ select access_month, count(*) as all_count
35
+ from (
36
+ select distinct user_id, substr(access_day, 1, 7) as access_month
37
+ from access_record
38
+ where access_type = 101
39
+ )
40
+ group by access_month
41
+ ) a
42
+ 以下同じ
43
+ ```

2

コメント追加

2016/01/21 03:44

投稿

jcs502ulf
jcs502ulf

スコア307

answer CHANGED
@@ -1,4 +1,4 @@
1
- access_dayではなく、月をベースに集計すれば良いと思います。
1
+ ご質問のSQLのサブクエリーは(access_dayではなく)月を返すようにしその月をベースに集計すれば良いと思います。
2
2
  - 月ごとの新規ユーザー数
3
3
  - 月ごとの全アクセス数
4
4
  この2つの結果セットを外部結合することで「月ごとの全アクセス数-新規ユーザー数=リピーター数」になると思います。

1

誤字の修正

2016/01/15 07:04

投稿

jcs502ulf
jcs502ulf

スコア307

answer CHANGED
@@ -1,7 +1,8 @@
1
1
  access_dayではなく、月をベースに集計すれば良いと思います。
2
2
  - 月ごとの新規ユーザー数
3
3
  - 月ごとの全アクセス数
4
- この2つ結果セットを外部結合することで「月ごとの全アクセス数-新規ユーザー数=リピーター数」になると思います。
4
+ この2つ結果セットを外部結合することで「月ごとの全アクセス数-新規ユーザー数=リピーター数」になると思います。
5
+
5
6
  Oracleですがご参考までに。
6
7
  ※「substr(access_day, 1, 7)」は「date_format( b.c, '%Y-%m' )」と同義です。
7
8
  ```SQL