row_number() order() 函数会为查询出来的每一行记录生成一个序号,依次排序且不会重复,注意使用row_number函数时必须要用over子句选择对某一列进行排序才能生成序号。
rank() order() 函数用于返回结果集的分区内每行的排名,行的排名是相关行之前的排名数加一。简单来说rank函数就是对查询出来的记录进行排名,与row_number函数不同的是,rank函数考虑到了over子句中排序字段值相同的情况,如果使用rank函数来生成序号,对于OVER中字段相同的排序是一样的,下一个不同的字段的排序就是上一个排序+上一个的同字段的数量。
dense_rank() order() 函数与rank函数相似,都考虑到了over子句中排序字段值相同的情况,不同的是dense_rank()生成的序号是连续的,当出现相同排名时,下一个字段值相同的排名时紧接着上一个排名的值即上一个排名值加1,比如,针对dense_rank()来说,有两个排序第一,那么下一个排序就是第二,而对于rank()来说两个排序第一下一个排序就是第三。对于不存在相同字段的情况dense_rank()与rank()以及row_number() 的结果是一样的。
有如下数据:
row_number order()按订单号由小到大排序:
rank() order()按订单号由小到大排序:
dense_rank() order()按订单号由小到大排序: