关于一次面试的sql题:
题目:在一张订单表中有三个字段,order_id, sale_num, type(类型有:衣服,鞋子,皮包),现在希望取出每种类型销量前三的记录。
我在面试时候还想,啥,啥玩意,要我写单表的查询?看不起我?这不就是group by ,在order by啊,等等好像不太对劲,在仔细想想,好吧我做不出来,是我菜了后来根据百度和自己琢磨也搞了出来。
有两种方法,思想都是一样的,给每个同类型的加个排名最后再过滤。
方法1(子查询):
select order_id,
(select count(1)+1
from order o2
where o1.type = o2.type and o1.sale_sum < o2.sale_sum) rank
from order o1
where rank < 3
方法2(使用用户变量):
select o2.order_id, o2.rank
from
(select order_id, if(@p=o1.type,@r=1,@r:=@r+1 ) rank, @p:=o1.type
from order o1
order by o1.type desc, o1.sale_sum desc)o2
where o2.rank < 3
使用用户变量是比较灵活的,比如再加一个如果销售金额相同,根据创建时间来排序,子查询就比较难了,而用户变量只要再order by后面加排序就好了。
转载请注明原文地址:https://tech.qufami.com/read-19543.html