欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

row_number()、rank()、dense_rank()排序方式的区别

程序员文章站 2022-05-29 12:41:46
1.row_number() 排序策略,连续排序,它会为查询出来的每一行记录生成一个序号,依次排序且不会重复,例如1,2,3,4 SELECT names,dept,row_number() OVER(PARTITION BY dept ORDER BY age DESC) rank FROM wo ......

1.row_number() 排序策略,连续排序,它会为查询出来的每一行记录生成一个序号,依次排序且不会重复,例如1,2,3,4

  select names,dept,row_number() over(partition by dept order by age desc) rank from workers;

row_number()、rank()、dense_rank()排序方式的区别

 

 

2.dense_rank()  排序策略,连续排序,如果有两个同一级别时,接下来是第二级别 ,例如1,2,2,3

select names,dept,dense_rank() over(partition by dept order by age desc) rank from workers;

结果如下图

row_number()、rank()、dense_rank()排序方式的区别

 

3.rank() 排序策略, 跳跃排序,如果有两个同一级别时,接下来是第三级别,例如1,2,2,4

select names,dept,rank() over(partition by dept order by age desc) rank from workers;

结果如下图

row_number()、rank()、dense_rank()排序方式的区别

 

 

 

with workers as (
select 'doma' dept ,'zhangsan' names,23 age,4000 salaries from dual
union all
select 'doma' dept ,'lisi' names,35 age,9000 salaries from dual
union all
select 'domb' dept ,'wangwu' names,26 age,6500 salaries from dual
union all
select 'domb' dept ,'zhaoliu' names,28 age,7000 salaries from dual
union all
select 'domb' dept ,'maqi' names,26 age,6000 salaries from dual
union all
select 'doma' dept ,'fengba' names,25 age,6500 salaries from dual
union all
select 'domb' dept ,'sujiu' names,25 age,7000 salaries from dual
)

--row_number() 排序策略,连续排序,它会为查询出来的每一行记录生成一个序号,依次排序且不会重复,例如1,2,3,4
select names,dept,row_number() over(partition by dept order by age desc) rank from workers;

 

--dense_rank() 连续排序,如果有两个同一级别时,接下来是第二级别 
select names,dept,dense_rank() over(partition by dept order by age desc) rank from workers;

 

--rank() 跳跃排序,如果有两个第一级别时,接下来是第三级别
select names,dept,rank() over(partition by dept order by age desc) rank from workers;

 

关于parttion by:
  parttion by关键字是oracle中分析性函数的一部分,用于给结果集进行分区。它和聚合函数group by不同的地方在于它只是将原始数据进行名次排列,
能够返回一个分组中的多条记录(记录数不变),而group by是对原始数据进行聚合统计,一般只有一条反映统计值的结果(每组返回一条)。