在同一个 SQL 查询中使用 rank() 和 count()

Posted

技术标签:

【中文标题】在同一个 SQL 查询中使用 rank() 和 count()【英文标题】:Use rank() en count() in same SQL query 【发布时间】:2020-06-27 14:43:04 【问题描述】:

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

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

我已尝试以下查询。但这会为所有行提供值“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

【问题讨论】:

客户的订单数量真的不同吗? 您能否在您的预期输出中添加一些示例数据? @mkRabbani 我刚刚做了。希望我的问题现在很清楚。 【参考方案1】:

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

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

考虑:

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

【讨论】:

以上是关于在同一个 SQL 查询中使用 rank() 和 count()的主要内容,如果未能解决你的问题,请参考以下文章

sql查询解释:oracle的rank和partition

使用rank/u rank的SQL Server查询示例

SQL查询如何对增量键RANK中的相同结果进行单独分组

Hacker Rank SQL 问题:15 天的 SQL,如何使用 AND 选择查询

ORACLE分组排序查询

mysql报错:mysql5.7和mysql8,查询时sql关键字rank问题