市场分析 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_itemsfrom oi join users u on oi.seller_id = u.seller_id
where oi.item_brand <> u.favorite_brandgroup 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