巨人网络\春招\数据开发\笔试\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
因原始数据超出限制,可以找我要
#春招##大数据##实习#
数仓-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 ;
这样应该可行;
分享
需要投递数据开发的小伙伴联系我哦,高途集团
分享
滴滴
官网直投
这题感觉牛客有,我是用的窗口函数做的。小白浅写,请大佬多多批评指教。
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
分享
相关推荐
点赞 评论 收藏
转发
点赞 评论 收藏
转发