拼多多面试SQL题讨论

17号面试的时候手撕一道SQL题没有做出来,现在想和大家讨论一下,就是一张表里有 mall_id, gmv
现在把这个总的gmv分均分成10个层级,每个层级的GMV由多少家店铺构成,输出的表字段是 layer(layer1,layer2....),  count(前10%GMV由多少家店铺贡献,10-20%由多少家贡献),
和小红书的笔试题有点类似,但是这个更麻烦,不知道有没有大佬知道什么比较简单的函数可以做的
#拼多多##面试题目#
全部评论
select concat('layer', c.rk) as layer, count(c.rk) as count from (select b.mall_id, case  when b.t2/b.t1 >= 0 and b.t2/b.t1 <= 0.1 then '1' when b.t2/b.t1 > 0.1 and b.t2/b.t1 <= 0.2 then '2' when b.t2/b.t1 > 0.2 and b.t2/b.t1 <= 0.3 then '3' when b.t2/b.t1 > 0.3 and b.t2/b.t1 <= 0.4 then '4' when b.t2/b.t1 > 0.4 and b.t2/b.t1 <= 0.5 then '5' when b.t2/b.t1 > 0.5 and b.t2/b.t1 <= 0.6 then '6' when b.t2/b.t1 > 0.6 and b.t2/b.t1 <= 0.7 then '7' when b.t2/b.t1 > 0.7 and b.t2/b.t1 <= 0.8 then '8' when b.t2/b.t1 > 0.8 and b.t2/b.t1 <= 0.9 then '9' else '10' end as rk from (select a.mall_id, sum(a.total_gmv) as t1, sum(a.total_gmv) over(order by a.total_gmv desc) as t2 from (select mall_id, sum(gmv) as total_gmv from mall_gmv group by mall_id) a) b) c group by c.rk order by layer; 同2楼的思路,内部排序还是gmv降序,感觉题目表述不清,和小红书那个差不多
点赞 回复
分享
发布于 2019-08-20 09:47
percent_rank() + case
点赞 回复
分享
发布于 2019-08-20 03:07
联想
校招火热招聘中
官网直投
sum(gmv)over(order by gmv rows between unbounded preceding and current row) as r1, floor(r1/sum(gmv)*10) as layer, count(1) group by layer 我的思路是这样的,感觉这个题意没理解的特别清楚,我默认商家gmv是排序过的了,不要求排序的话那这个每一层的个数不是可以有很多答案么
1 回复
分享
发布于 2019-08-20 09:07
你是不是上海场一点那个手推公式大兄弟😂
1 回复
分享
发布于 2019-08-20 13:35
重读题目后,发现不应该用percent_rank,一个笨办法是先用sum()算累积,再除以总gMV得到各店铺对应的累积贡献,然后在这张表的基础上再用case
点赞 回复
分享
发布于 2019-08-20 07:08
我的话,会先对每个店铺的gmv进行rank排序命名r1,自己count求总店铺数命名r2,然后在这张表的基础上,用case when把r1/r2分成10个层级
点赞 回复
分享
发布于 2019-08-20 08:37
想了下还是没太懂这题的意思,什么是10%-20%gmv的商家数……还是说要算的是前10%的,前20%,……一直到100%,这两种结果输出完全不一样啊
点赞 回复
分享
发布于 2019-08-20 09:28

相关推荐

1 56 评论
分享
牛客网
牛客企业服务