order by 子查询_mysql查询——查找订单最多的客户

7e031e8d124cc8070484b9b6f44c24d9.gif

订单表(Order)中包含的订单明细数据如下图,其中OrderId表示订单编号,CustomerId表示客户编号,OrderDate表示下订单的日期,现需要编写一个查询语句,查询订单表(Order)中订单最多的客户编号和订单量

cb5e2e80e178df33b86ee4e8fc9af654.png

方法一:在having中使用子查询

第一步,对客户编号(CustomerId)进行分组计数,计算出各个客户的订单量。

select CustomerId,count(*) as OrderNumber

from Orders

group by CustomerId;

a77bf9e8ff0aaea5d28fbd8f7def666d.png

第二步,找出最大的订单量

select max(OrderNumber)

from(

select CustomerId,count(*) as OrderNumber

from Orders o1

group by o1.CustomerId

)o;

8d4582cb50d2c7c27a7a326b52c47e8e.png

第三步,用各个客户的订单量与最大订单量比较,找出订单最多的客户编号和订单量。

select o2.CustomerId,count(*) as OQ

from Orders o2

group by o2.CustomerId

having count(*)=(

select max(OrderNumber)

from(

select CustomerId,count(*) as OrderNumber

from Orders o1

group by o1.CustomerId

)o

);

14535a071adb180409821ee3e05c4579.png

方法二:使用窗口函rank()(此方法mysql8.0及以上版本可用)

第一步,对客户编号(CustomerId)进行分组计数,计算出各个客户的订单量。

select CustomerId,count(*) as OrderNumber

from Orders

group by CustomerId;

0b317d800ea873b36d180e42c9032b11.png

第二步:使用窗口函数rank()对订单量进行排名。

select CustomerId,OrderNumber,rank()over(order by OrderNumber desc)Rnk

from(

select CustomerId,count(*) as OrderNumber

from Orders

group by CustomerId

)o;

32a87a39b26a6070de190203bc29e04c.png

第三步,筛选排名第一的数据即为订单最多的客户编号和订单量。

select CustomerId,OrderNumber as OQ

from(

select CustomerId,OrderNumber ,rank()over(order by OrderNumber desc)Rnk

from(

select CustomerId,count(*) as OrderNumber

from Orders

group by CustomerId

)o

)o2

where Rnk=1;

39bffe83e07234eed0685e781a80bfa3.png

方法三:使用自定义变量

方法二中第二步对订单量进行排名也可使用自定义变量的方式实现,因此最终代码也可编写为:

select CustomerId,OrderNumber as OQ

from(

 select CustomerId,OrderNumber ,@a:=if(@pre=OrderNumber,@a,@a+1)Rnk,@pre:=OrderNumber

 from(

 select CustomerId,count(*) as OrderNumber

 from Orders

 group by CustomerId

 )o,(select @a:=0,@pre:=null)p

order by OrderNumber desc

)o2

where Rnk=1

order by CustomerId;

81bee8fd0d9c5ee70be816fdc58aacb9.png

ea06735db7f984a2d6f5e560fb97a058.gif

您看此文用  c391fe49c2d5ced08d819997c11b58eb.png·0c505b8d0b90abec1a4891714fbe705b.png 324e28487e32fa720ede14fba915645c.gif秒,转发只需1秒呦~

既然在看了,就点一下吧!!

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值