为何DENSE_RANK()中Partition By与Order By用同一列时结果全为1?
为什么DENSE_RANK()结果全为1?
这是个很容易踩的逻辑坑,我来给你理清楚问题出在哪:
你的查询逻辑拆解
你写的查询是:
SELECT orderid, custid , DENSE_RANK() OVER (Partition BY custid ORDER BY custid) as dense_rank FROM TABLE
这里的两个子句作用是:
Partition BY custid:把整张表按custid拆分成独立的分组(custid=1是一组,custid=2是一组,custid=3是一组)ORDER BY custid:在每个分组内部按custid排序
但问题来了——每个分组里的custid值都是完全相同的啊!比如custid=1的分组里,所有行的custid都是1,排序后它们的位置没有任何区别,所以DENSE_RANK()会给组内每一行都分配排名1,这完全符合函数的规则。
如何得到你想要的预期结果
你的预期是不同custid的分组拥有递增的排名(custid=1排1,custid=2排2,以此类推),这时候你不需要Partition BY子句,因为Partition BY是用来做组内排名的,而你要的是全局范围内按custid分组的排名。
正确的查询语句应该是:
SELECT orderid, custid, DENSE_RANK() OVER (ORDER BY custid) as dense_rank FROM TABLE
运行这个查询后,结果就会和你的预期一致:相同custid的行共享同一个排名,不同custid的排名依次递增。
额外补充:如果想做组内排序
如果你其实是想在每个custid分组里,对订单按orderid进行排名,那应该把ORDER BY的列换成orderid,比如:
SELECT orderid, custid, DENSE_RANK() OVER (PARTITION BY custid ORDER BY orderid) as dense_rank FROM TABLE
这时候custid=1的三个行就会按orderid得到1、2、3的排名,custid=2的四个行得到1、2、3、4的排名,以此类推。
内容的提问来源于stack exchange,提问作者siva narayana
相关产品推荐
相关产品推荐

