SQL中窗口函数rank(),dense_rank()排序

2020-08-19  本文已影响0人  木易楊_a

数据统计中经常遇到排序问题,按次数,销售额等排序的需求

拿例子来说

我们要按照价格从高到低的顺序,对下面这张表里的商品进行排序。让价格相同的商品位次也一样,而紧接着它们的商品则有两种排序方法,一种是跳过之后的位次,另一种是不跳过之后的位次

源表:products

1)sql如下,rank()实现跳位,dense_rank()不跳位

sql执行结果如下

注意:rank(),dense_rank()函数属于SQL中的新功能,只有个别数据库支持此函数,具体视数据库情况而定

考虑到函数的特殊性,下面采用非等值自连接实现排序

2)如下sql执行结果与rank()函数一样

3)如下sql执行结果与dense_rank()函数一样

加上distinct去重,存在相同次位的记录时,不跳过次位而是连续输出

默认排序从1开始,价格去重,{100,80,50,40,30}

100,没有比100大的,所以count()返回1

80,比80大的只有一个100,所以count()返回2

以此类推

你们也可以试下把>改成<,执行结果是否与心理预期一样

4)使用自连接也可以实现

如若改成内连接inner join 

没有比100大的,被连接条件p1.price<p2.price排除掉了,所以执行结果没有100,没有第一名

上一篇下一篇

猜你喜欢

热点阅读