首页 > 解决方案 > 在同一个 SQL 查询中使用 rank() 和 count()

问题描述

应该不是很困难,但我不会这么快。

我想选择所有客户,count()每个客户的订单数量以及dense_rank()基于此计数的 a。

我试过下面的查询。但这会为所有行提供值“1”作为 RankNumber。

select *, Dense_RANK() over(partition by NrOrders order by NrOrders desc) as RankNumber
from(
select CustomerID, count(*) as NrOrders
from Orders
group by CustomerID
) cpc

所以想要的结果是。

CustomerID  NrOrders  RankNumber
1           6         1
2           3         2
3           3         2
4           2         3

标签: sqlselectgroup-bycountwindow-functions

解决方案


您的代码的问题是窗口函数的分区子句。它根据客户的订单数将客户分为不同的组,而您希望所有行都位于同一分区中,按订单数降序排列。

另外,不需要子查询,可以直接在聚合查询中使用窗口函数。

考虑:

select 
    CustomerID,
    count(*) as NrOrders,
    dense_rank() over(order by count(*) desc) rn
from Orders
group by CustomerID
order by NrOrders

推荐阅读