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

导读:本篇文章讲解 求每个店铺访问次数top3的访客信息,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com

题目
有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)每个店铺的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)每个店铺的UV(访客数)

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

        SELECT shop,
               count(DISTINCT user_id)
        FROM visit
        GROUP BY shop;

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

        SELECT t.shop,
               count(*)
        FROM
          (SELECT user_id,
                  shop
           FROM visit
           GROUP BY shop,
		            user_id,
                    ) t
        GROUP BY t.shop

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

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

select
    shop,
    user_id,
    count(*) ct
from visit
group by shop,user_id;---t1

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

select
     shop,
     user_id,
     ct, 
     rank() over(partition by shop order by ct DESC) rk
from t1;---t2

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

select
    shop,
    user_id,
    ct
from t2
where rk<=3

最终:

	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;

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

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/89167.html

(0)
小半的头像小半

相关推荐

极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!