1

私は、SQL クエリを記述して、ユーザーの日常と保持を取得する方法を理解しようとしています。次の行テーブル round_statistics を各プレイ ラウンドに配置することを検討してください。ラウンドの日付がわかりました。1. 日曜日と月曜日、月曜日と火曜日、日曜日と火曜日は 2 日連続とは見なされません。2. ユーザー維持率 1-7

保持 7 は : 過去 7 日間プレイする機会があり (少なくとも 7 日間登録されていることを意味します)、7 日後になんらかのアクティビティ (記録) があったユーザーの割合です。

リテンション 6-1 は 6-1 日だけ同じです。

私のゲームの保持を見つけるのを手伝ってください:)あなたはそれをプレイするための無料のコインを手に入れます....ありがとう。

テーブル構造は次のとおりです: user_id,round_time

たとえば、今日 3 回プレイした場合:

user id | round_time
1000,   | '2013-08-10 14:02:53' 
1000,   | '2013-08-10 14:03:25' 
1000,   | '2013-08-10 14:04:47'

結果の構造は次のとおりです。

date        |  2013-08-10 |   2013-07-10 
day to day  |  10         |   100         
retention 7 |  15         |   125         
retention 6 |  20         |   210         
retention 5 |  30         |   320         
retention 4 |  40         |   430         
retention 3 |  50         |   540         
retention 2 |  60         |   650         
retention 1 |  120        |   1620   
4

1 に答える 1

2

私のSQLには分析関数もCTEもピボットテーブル機能もありません。このため、必要なクエリを直接実行することはできません(そして誰もあなたの質問に答えません)。

このデータの場合:

create table t ( uid int, rt date);
insert into t values 
(99,    '2013-08-7 14:02:53' ),     <- gap
(99,    '2013-08-9 14:02:53' ),     <-
(99,    '2013-08-10 14:03:25' ),
(1000,    '2013-08-7 14:02:53' ),
(1000,    '2013-08-8 14:03:25' ),
(1000,    '2013-08-9 14:03:25' ),
(1000,   '2013-08-10 14:04:47');

これは、特定の日付のピボット保持前のアプローチです( '2013-08-10 00:00:00' , '%Y-%m-%d')

select count( distinct uid ) as n, d, dt from
(
  select uid,
         '2013-08-10 00:00:00' as d,
         G.dt      
  from 
    t
  inner join
    ( select 7 as dt union all 
      select 6 union all select 5 union all
      select 4 union all select 3 union all
      select 2 union all select 1 union all select 0) G
  on DATE_FORMAT( t.rt, '%Y-%m-%d') between
        DATE_FORMAT( date_add( '2013-08-10 00:00:00', Interval -1 * G.dt DAY) , 
                    '%Y-%m-%d')
     and
        DATE_FORMAT(  '2013-08-10 00:00:00' , '%Y-%m-%d')
  where DATE_FORMAT(rt , '%Y-%m-%d') <= DATE_FORMAT(  '2013-08-10 00:00:00' , 
                                                      '%Y-%m-%d')
  group by uid, G.dt
  having  count( distinct DATE_FORMAT( T.rt, '%Y-%m-%d') )  = G.dt + 1
) TT
group by dt

事前に調理されたデータ (DT = 0 は今日の訪問を意味し、DT = 1 は連続した 2 日間を意味します...):

| N |                   D | DT |
--------------------------------
| 2 | 2013-08-10 00:00:00 |  0 |
| 2 | 2013-08-10 00:00:00 |  1 |
| 1 | 2013-08-10 00:00:00 |  2 |
| 1 | 2013-08-10 00:00:00 |  3 |

ここにあります(同じデータの場合):

select count( distinct uid ) as n, d, dt from
(
  select uid,
         z.zt as d,
         G.dt      
  from 
    t
  cross join
     ( select distinct DATE_FORMAT( t.rt, '%Y-%m-%d') as zt from t) z
  inner join
    ( select 7 as dt union all 
      select 6 union all select 5 union all
      select 4 union all select 3 union all
      select 2 union all select 1 union all select 0) G
  on DATE_FORMAT( t.rt, '%Y-%m-%d') between
        DATE_FORMAT( date_add( z.zt, Interval -1 * G.dt DAY) , 
                    '%Y-%m-%d')
     and
        z.zt
  where z.zt <= z.zt
  group by uid, G.dt, z.zt
  having  count( distinct DATE_FORMAT( T.rt, '%Y-%m-%d') )  = G.dt + 1
) TT
group by d,dt
order by d,dt

sqlfiddle での結果: http://sqlfiddle.com/#!2/c26ec/10/0

| N |          D | DT | GROUP_CONCAT( UID) |
--------------------------------------------
| 2 | 2013-08-07 |  0 |            1000,99 |
| 1 | 2013-08-08 |  0 |               1000 |
| 1 | 2013-08-08 |  1 |               1000 |
| 2 | 2013-08-09 |  0 |            1000,99 |
| 1 | 2013-08-09 |  1 |               1000 |
| 1 | 2013-08-09 |  2 |               1000 |
| 2 | 2013-08-10 |  0 |            1000,99 |
| 2 | 2013-08-10 |  1 |            99,1000 |
| 1 | 2013-08-10 |  2 |               1000 |
| 1 | 2013-08-10 |  3 |               1000 |
于 2013-08-11T15:36:02.080 に答える