• 求每个店铺访问次数top3的访客信息


    题目
    有50W个京东店铺,每个顾客访客访问任何一个店铺的任何一个商品时都会产生一条访问日志,
    访问日志存储的表名为Visit,访客的用户id为user_id,被访问的店铺名称为shop,数据如下:

     	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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    请统计:
    (1)每个店铺的UV(访客数)
    (2)每个店铺访问次数top3的访客信息。输出店铺名称、访客id、访问次数;

    实现:

    数据准备:

    CREATE TABLE visit( 
                             user_id string, 
                             shop string )
                ROW format delimited FIELDS TERMINATED BY '\t'; 
                INSERT INTO TABLE visit VALUES
                ( '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' );  
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    (1)每个店铺的UV(访客数)

    方法一:
    每个店,即以shop来group by 分组,count计算访客数量同时去重即可;

            SELECT shop,
                   count(DISTINCT user_id)
            FROM visit
            GROUP BY shop;
    
    • 1
    • 2
    • 3
    • 4

    方法二:
    使用shop和user_id 联合去重,即可去重!

            SELECT t.shop,
                   count(*)
            FROM
              (SELECT user_id,
                      shop
               FROM visit
               GROUP BY shop,
    		            user_id,
                        ) t
            GROUP BY t.shop
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    (2)每个店铺访问次数top3的访客信息。输出店铺名称、访客id、访问次数;

    思路
    ① 先统计 每个shop中、每个用户的访问次数,用联合分组,

    select
        shop,
        user_id,
        count(*) ct
    from visit
    group by shop,user_id;---t1
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    ②对shop开窗,用rank() 计算用户的访问次数排名

    select
         shop,
         user_id,
         ct, 
         rank() over(partition by shop order by ct DESC) rk
    from t1;---t2
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    ③ 用where 限制rk排名, 筛选出每个shop访问次数排名前三的用户;

    select
        shop,
        user_id,
        ct
    from t2
    where rk<=3
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    最终:

    	select 
    	   shop,
    	   user_id,
    	   ct
    	from
    		 (select 
    		   shop,
    		   user_id,
    		   ct,
    		   rank() over(partition by shop order by ct DESC) rk
    		  from 
    			 (select 
    			   shop,
    			   user_id,
    			   count(*) ct
    			  from visit
    			  group by 
    			     shop,
    			     user_id)t1
    		)t2
    	where rk<=3;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21

    参考:
    https://blog.csdn.net/Poolweet_/article/details/109614982
    https://www.modb.pro/db/79137

  • 相关阅读:
    serveless 思想 Midway.js 框架使用教程(五)
    模板的特化
    C++11 智能指针
    Linux——报错合集2
    绝绝子还是YYDS,2021国民年度流行语出炉
    PROFINET 模拟器使用教程
    【2022】【论文笔记】太赫兹量子阱探测——
    解决Mac上执行pip install -e turtle 报错
    Chapter8.1:非线性控制系统分析
    【有源码】基于asp.net的旅游度假村管理系统C#度假村美食住宿一体化平台源码调试 开题 lw ppt
  • 原文地址:https://blog.csdn.net/Swofford/article/details/126877195