首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >MySQL用户保留和日常使用

MySQL用户保留和日常使用
EN

Stack Overflow用户
提问于 2013-08-11 12:35:12
回答 1查看 3.8K关注 0票数 1

我试图弄清楚如何编写我的SQL查询,以便让用户日复一日地保持下去。考虑在每一轮比赛中都有下一轮的round_statistics,现在我想: 1.知道有多少用户连续玩两天,意思是在星期日和星期一,星期一和星期二,但是星期日和星期二不算连续两天。2.用户保留1-7

保留7%的用户有机会玩最后7天(意味着他们注册了至少7天),并有一些活动(记录)在7天后。

保留时间6-1天是相同的。

请帮助我找出我的游戏保留:)你将得到一个免费的硬币来玩它.谢谢。

表的结构是: user_id,round_time

例如,如果我今天玩了三次:

代码语言:javascript
运行
复制
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'

结果结构是:

代码语言:javascript
运行
复制
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   
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-08-11 15:36:02

我的sql没有解析函数,也没有CTE和枢轴表特性,因此不直接执行所需的查询(而且没有人回答您的问题)。

对于这些数据:

代码语言:javascript
运行
复制
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'),这是一种在支点保留之前的方法:

代码语言:javascript
运行
复制
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天,.):

代码语言:javascript
运行
复制
| 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 |

这是(对于相同的数据):

代码语言:javascript
运行
复制
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

代码语言:javascript
运行
复制
| 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 |
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18171952

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档