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

本文介绍了如何使用SQL统计每个京东店铺的唯一访客数(UV)及每个店铺访问次数前三的访客信息。通过数据表`visit`,分别使用GROUP BY与窗口函数rank()实现了店铺访客计数与访问频率排名。方法包括通过用户ID与店铺名联合去重计算UV,以及通过窗口函数获取每个店铺的访问次数排名。
摘要由CSDN通过智能技术生成

题目
有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

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值