SQL练习题——店铺UV、访客信息

数据表

在这里插入图片描述
问题:

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

问题1解答:

select 
	shop, count(distinct user_id) as count_user
from jd
group by shop

在这里插入图片描述
问题2解答:
根据题意,我们可以先将问题拆分:
1)获取每个店铺的访客次数信息

select 
	shop, user_id, count(user_id) as count_user
from jd
group by shop, user_id

在这里插入图片描述
2)分别对每个店铺中访客的次数进行排序

set @i :=0, @type :='';
select
	@i := case when @type = shop then @i+1 else 1 end as num,
	@type := shop as type,
	a.*
from(
	select 
		shop, user_id, count(user_id) as count_user
	from jd
	group by shop, user_id
	order by shop, count_user desc
) a

在这里插入图片描述
3)获取访问次数前三的访客信息

set @i :=0, @type :='';
select
	b.num, b.shop, b.user_id, b.count_user
from(
	select
		@i := case when @type = shop then @i+1 else 1 end as num,
		@type := shop as type,
		a.*
	from(
		select 
			shop, user_id, count(user_id) as count_user
		from jd
		group by shop, user_id
		order by shop, count_user desc
	) a
) b
where b.num<=3

在这里插入图片描述

如果使用MySQL8.0版本,可以通过row_number() over()方法进行排序

代码如下:

select 
	b.num, b.shop, b.user_id, b.count_user
from(
	select
		shop, user_id, count_user,
		row_number() over(partition by shop order by count_user desc) as num
	from(
		select shop, user_id, count(user_id) as count_user
		from jd
		group by shop, user_id
	) a
) b
where b.num <=3
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值