sql 根据查询的记录生成序号的几种方式

row_number() over() 函数会为查询出来的每一行记录生成一个序号,依次排序且不会重复,注意使用row_number函数时必须要用over子句选择对某一列进行排序才能生成序号。

select row_number() over( order by col desc)  index from table --是先把col 列降序,再为降序以后的每条col 记录返回一个序号。
select row_number() over(partition by col1 order by col2)  index from table --表示先根据col1分组,在分组内部根据 col2升序排序。

rank()  over() 函数用于返回结果集的分区内每行的排名,行的排名是相关行之前的排名数加一。简单来说rank函数就是对查询出来的记录进行排名,与row_number函数不同的是,rank函数考虑到了over子句中排序字段值相同的情况,如果使用rank函数来生成序号,对于OVER中字段相同的排序是一样的,下一个不同的字段的排序就是上一个排序+上一个的同字段的数量。当存在字段值相同的情况时序号是不连续的。

select  rank() over(order by col desc)  index from table --先把col 列降序,再为降序以后的每条col 记录返回一个序号,col值相同的序号保持一致,下一次序号=上个序号+本次序号相同字段值数量+1;
select  rank() over(partition by col1 order by col2)  index from table  --表示先根据col1分组,在分组内部根据 col2升序排序,分组内部col2值相同的序号保持一致;

 

dense_rank() over() 函数与rank函数相似,都考虑到了over子句中排序字段值相同的情况,不同的是dense_rank()生成的序号是连续的,当出现相同排名时,下一个字段值相同的排名时紧接着上一个排名的值即上一个排名值加1,比如,针对dense_rank()来说,有两个排序第一,那么下一个排序就是第二,而对于rank()来说两个排序第一下一个排序就是第三。对于不存在相同字段的情况dense_rank()与rank()以及row_number() 的结果是一样的。

select  dense_rank() over(order by col desc)   index from table --先把col 列降序,再为降序以后的每条col 记录返回一个序号,col值相同的序号保持一致,下一个序号=本次序号+1;
select  dense_rank() over(partition by col1 order by col2)   index from table --表示先根据col1分组,在分组内部根据 col2升序排序,分组内部col2值相同的序号保持一致;

 

有如下数据:

row_number  over()按订单号由小到大排序

rank() over()按订单号由小到大排序

dense_rank() over()按订单号由小到大排序

posted @ 2020-01-09 10:45  流年sugar  阅读(9344)  评论(0编辑  收藏  举报