巨人网络\春招\数据开发\笔试\hard

巨人网络\春招\数据开发\笔试\hard
数仓-SQL面试题-实录

字段:uid 用户ID、artical_id 文章ID、in_time 进入时间、out_time 离开时间、sign_cin 是否签到

问题:统计每天的日活数及新用户占比

注:
新用户占比 = 当天的新用户数/当天活跃用户数(日活数)
如果in_time 进入时间 和 out_time 离开世界跨天了,在跨天的每天都记为该用户活跃过
新用户占比保留2位小数,结果按日期升序排序

示例数据的输出结果如下
dt       dau uv_new_ratio
2021-10-31 2 1.00
2021-11-01 3 0.33
2021-11-02 3 0.67
2021-11-03 5 0.40

解释
2021年10月31日有2个用户活跃,都为新用户,新用户占比1.00
2021年11月1日有3个用户活跃,其中1个为新用户,新用户占比0.33

因原始数据超出限制,可以找我要
#春招##大数据##实习#
全部评论
SELECT dt, cnt AS dau, ROUND(COUNT(IF(dt = min_dt, 1, NULL)) OVER (PARTITION BY uid) / cnt, 2) AS uv_new_ratio FROM (SELECT dt, uid, COUNT(uid) OVER (PARTITION BY dt) AS cnt, MIN(dt) OVER (PARTITION BY uid) AS min_dt FROM (SELECT uid, in_time AS dt FROM t UNION SELECT uid, out_time AS dt FROM t) t1 ) t2 order by dt asc ; 这样应该可行;
1
送花
回复
分享
发布于 04-13 18:44 重庆
需要投递数据开发的小伙伴联系我哦,高途集团
1
送花
回复
分享
发布于 04-14 16:20 北京
蔚来
校招火热招聘中
官网直投
这题感觉牛客有,我是用的窗口函数做的。小白浅写,请大佬多多批评指教。 with tiaojian as ( select uid,in_time as pday from 实录表 union all select uid,out_time as pday from 实录表 ) select t.pday, sum(case when t.m=1 then 1 else 0 end), round( sum(case when t.m=1 then 1 else 0 end)/count(distinct t.uid),2) from( select uid, pday, row_number()over(partition by uid order by pday asc) as m from tiaojian ) as t group by t.pday
点赞
送花
回复
分享
发布于 04-15 17:54 北京

相关推荐

头像
06-04 19:10
Java
点赞 评论 收藏
转发
1 收藏 评论
分享
牛客网
牛客企业服务