市场分析 3 mysql (槽)

本题有挺多槽点的

市场分析 3

 链接:

市场分析 III

读题:

1. 要求的是卖出的东西不是最喜欢的品牌,且比如卖出了10件都是一个品牌的,也仅仅计数为1。

2. 按照上述计数结果返回计数最大的卖家以及计数结果。

博主思考:

首先,题目的描述就很笼统,我认为,不同的item_id 可能 是同样的品牌,比如 iphone和ipad的品牌都是苹果,所以应该以item_brand 进行去重计数。

所以思路是这样的:

1. orders 表连表 items,得到oi 表, 获取每个订单的商品的品牌item_brand

2. oi表连接users表,获取每个订单对应的卖家的最喜欢的品牌

3. 对比当前订单中商品品牌和当前订单卖家的最喜欢品牌是否相同,筛选出不同的

4. 按照卖家分组,去重计数品牌种类

5. 使用rank()而不是row_number()开窗排名,筛出排名为1的排序后输出。

所以,我一开始的代码是这样的:

-- 每个订单中对应的品牌名
with oi as 
(
select order_id,seller_id, item_brand
from orders o join items i on o.item_id = i.item_id
)
,
-- 每个卖家卖了了几种非喜爱品牌
oiu as 
(
select oi.seller_id,
count(distinct oi.item_brand) as num_items
from oi join users u on oi.seller_id = u.seller_id 
where oi.item_brand != u.favorite_brand
group by oi.seller_id
)


select seller_id,num_items from 
(		
select seller_id,num_items ,rank() over(order by num_items desc) as rk from 
oiu order by seller_id asc
) t where rk = 1

but! 

仅仅通过前两个案例。

于是经过一顿排查。直接在力扣上输出发现:按照品牌计数种类就不行,以案例3的seller_id = 26 为例,我们在原步骤中,在找到所有与最喜欢的品牌不同的所有订单后,不分组计数,也不去排名,而是直接输出筛选结果看看:

-- 每个订单中对应的品牌名
with oi as 
(
select order_id,seller_id, item_brand
from orders o join items i on o.item_id = i.item_id
)
,
-- 每个卖家卖了了几种非喜爱品牌
oiu as 
(
select oi.order_id,oi.seller_id,oi.item_brand,u.favorite_brand
-- count(distinct oi.item_brand) as num_items
from oi join users u on oi.seller_id = u.seller_id 
where oi.item_brand != u.favorite_brand and oi.seller_id = 26
-- group by oi.seller_id
)

select * from oiu

输出结果

发现:它预期输出结果按照题目要求和案例解读中的意思,是26号卖家卖出了6与最喜爱的品牌不同的商品。

然后我们人为看一下输出结果,(321,131) 两个订单的品牌是一样的,(7,183)两个 订单的品牌也一样,两组只能算作两种品牌。也就是26号卖家卖出的与最喜爱的品牌不同的商品应该是4种

这就发现与题目的说法不同的地方了,这就是博主想吐槽的地方。

所以,想要通过这道题的所有案例,那就直接按照item_id去重计数才行。

所以,最终改成下面这样可以通过所有案例:

with oi as 
(
select order_id,seller_id, item_brand,o.item_id
from orders o join items i on o.item_id = i.item_id
)
,
-- 每个卖家卖了了几种非喜爱品牌
oiu as 
(
select oi.seller_id,
-- count(distinct oi.item_brand) as num_items
count(distinct oi.item_id) as num_items

from oi join users u on oi.seller_id = u.seller_id 
where oi.item_brand <> u.favorite_brand

group by oi.seller_id
)



select seller_id,num_items from 
(		
select seller_id,num_items ,rank() over(order by num_items desc) as rk from 
oiu order by seller_id asc
) t where rk = 1

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值