sql - 在同一个 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
解决方案
您的代码的问题是窗口函数的分区子句。它根据客户的订单数将客户分为不同的组,而您希望所有行都位于同一分区中,按订单数降序排列。
另外,不需要子查询,可以直接在聚合查询中使用窗口函数。
考虑:
select
CustomerID,
count(*) as NrOrders,
dense_rank() over(order by count(*) desc) rn
from Orders
group by CustomerID
order by NrOrders
推荐阅读
- git - 为构建机器运行的 Git 命令以使存储库尽可能无故障
- reactjs - React 功能组件状态总是记录初始值
- json - 如何解组不同类型的流
- r - 用多行更改ggplot上的刻度线
- excel - VLOOKUP 多个值
- angular - 存储与随时随地提出请求
- docker - 如何从 Windows 10 连接 Docker-Linux 上的 docker-compose Sql 服务器容器?
- c# - ASP.NET MVC 5 在重定向时丢弃尾随句点
- wordpress - 如何在 WordPress PayPal 插件中的 WordPress PayPal 结账时添加额外的查询字符串变量
- outlook - 使用 Ms Graph Api 将附件文件从 Outlook 复制到 onedrive,无需下载