题解 | #每天的日活数及新用户占比#

每天的日活数及新用户占比

http://www.nowcoder.com/practice/dbbc9b03794a48f6b34f1131b1a903eb

# 如果in_time-进入时间 和out_time-离开时间跨天了在两天里都记为该用户活跃过
# 使用 **union** 连接in_time 和 out_time找出in_time 和 out_time 不同的数据,
并把in_time 和 out_time相同的数据进行**去重**
with tmp as
(
    select
       uid,
       date_format(in_time, '%Y-%m-%d') cur_time
    from
        tb_user_log 
    union # 去重,并且保留in_time 和 out_time 不同的数据
    select
       uid,
       date_format(out_time, '%Y-%m-%d') cur_time
    from
        tb_user_log 

)
# 把登录的最小日期拼接到最后一列,用来判断是否为新增用户:当前日期 <= min_date 表示为新增用户
# select
#      tmp.uid,
#      cur_time,
#      min_date
#  from
#      tmp 
#  join
#      (
#          select
#              uid,
#              min(cur_time) min_date
#          from
#              tmp
#          group by
#              uid
#      )t
#  on 
#      tmp.uid = t.uid

alt

select
    cur_time,
    dau,
    round(uv_new / dau, 2) uv_new_ratio
from
    (
        select    
            cur_time,
            count(*) dau,
            sum(if(cur_time <= min_date, 1, 0)) uv_new  # 当前日期 <= min_date 表示为新增用户 
        from
            (
              # 把登录的最小日期拼接到最后一列的子表
                select
                     tmp.uid,
                     cur_time,
                     min_date
                 from
                     tmp 
                 join
                     (
                         select
                             uid,
                             min(cur_time) min_date
                         from
                             tmp
                         group by
                             uid
                     )t
                 on 
                     tmp.uid = t.uid
            )tt
        group by 
             cur_time
    )t2
全部评论

相关推荐

像好涩一样好学:这公司我也拿过 基本明确周六加班 工资还凑活 另外下次镜头往上点儿
点赞 评论 收藏
分享
M_bao:换个排版吧哥们,看着费劲
点赞 评论 收藏
分享
评论
点赞
收藏
分享
牛客网
牛客企业服务