数据统计中经常遇到排序问题,按次数,销售额等排序的需求
拿例子来说
我们要按照价格从高到低的顺序,对下面这张表里的商品进行排序。让价格相同的商品位次也一样,而紧接着它们的商品则有两种排序方法,一种是跳过之后的位次,另一种是不跳过之后的位次
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,没有第一名