第1题
有如下的用户访问数据
userId | visitDate | visitCount |
u01 | 2017/1/21 | 5 |
u02 | 2017/1/23 | 6 |
u03 | 2017/1/22 | 8 |
u04 | 2017/1/20 | 3 |
u01 | 2017/1/23 | 6 |
u01 | 2017/2/21 | 8 |
u02 | 2017/1/23 | 6 |
u01 | 2017/2/22 | 4 |
要求使用SQL统计出每个用户的累积访问次数,如下表所示:
用户id | 月份 | 小计 | 累积 |
u01 | 2017-01 | 11 | 11 |
u01 | 2017-02 | 12 | 23 |
u02 | 2017-01 | 12 | 12 |
u03 | 2017-01 | 8 | 8 |
u04 | 2017-01 | 3 | 3 |
数据:
u01 2017/1/21 5
u02 2017/1/23 6
u03 2017/1/22 8
u04 2017/1/20 3
u01 2017/1/23 6
u01 2017/2/21 8
u02 2017/1/23 6
u01 2017/2/22 4
参考答案:
第2题
有50W个京东店铺,每个顾客访客访问任何一个店铺的任何一个商品时都会产生一条访问日志,访问日志存储的表名为Visit,访客的用户id为user_id,被访问的店铺名称为shop,请统计:
- 每个店铺的UV(访客数)
Select shop, count(user_id) from visit group by shop;
- 每个店铺访问次数top3的访客信息。输出店铺名称、访客id、访问次数
数据:
u1 a
u2 b
u1 b
u1 a
u3 c
u4 b
u1 a
u2 c
u5 b
u4 b
u6 c
u2 c
u1 b
u2 a
u2 a
u3 a
u5 a
u5 a
u5 a
参考答案
-- 第一步:统计每一个店铺每一位顾客的访问次数
select shop, userid, count(*) as visit_count from visit group by shop, userid;
-- 第二步:对统计出来的访问次数排序(每一个店铺中分别排序)并给定编号
select *,
rank() over(partition by shop order by visit_count desc) as n
from (
select shop, userid, count(*) as visit_count from visit group by shop, userid
)t1;
-- 第三步:筛选编号<=3的用户信息
select *
from (
select *,
rank() over(partition by shop order by visit_count desc) as n
from (
select shop, userid, count(*) as visit_count from visit group by shop, userid
)t1
) t2 where n <= 3;