1. 程式人生 > >mssql sqlserver 分組排序函式row_number、rank、dense_rank用法簡介及說明

mssql sqlserver 分組排序函式row_number、rank、dense_rank用法簡介及說明

轉載:http://www.maomao365.com/?p=5771

摘要:

在實際的專案開發中,我們經常使用分組函式,對組內資料進行群組後,然後進行組內排序:
如:
1:取出一個客戶一段時間內,最大訂單數的行記錄
2: 取出一個客戶一段時間內,最後一次銷售記錄的行記錄
————————————————
下文將講述三個分組函式 row_number rank dense_rank的用法 ,

以上三個函式的功能為:返回行資料在”分組資料內”的排列值

1:row_number() over() 函式簡介

row_number() over(partition by [分組列] order by [排序列])


分組列:這裡放入我們需要群組的列,可以為一列 也可以為多列,之間採用逗號分隔
排序列:分組後,排序依據列
通過row_number() over()排序後,依次生成分組後,行資料在分組內的排序值(1,2,3 …)

2:rank() over(partition by [分組列] order by [排序列]) 函式簡介

分組列和排序列同上
rank的群組內的排名方法為 如果出現兩個相同的排序列時,那麼下一個排序值為會自動加一
(1,1,3…)

3:dense_rank() over(partition by [分組列] order by [排序列]) 函式簡介

分組列和排序列同上
dense_rank的群組內的排名方法為 如果出現兩個相同的排序列時,那麼下一個排序值不會出現跳躍

例(1,1,2,3 ..)
——————————————————
例:

create table A  ([姓名] nvarchar(20),[訂單數] int,[訂單日期] datetime  )
go
insert into A ([姓名],[訂單數],[訂單日期]) values ('www.maomao365.com',1900,'2014-5-6')
insert into A ([姓名],[訂單數],[訂單日期]) values ('www.maomao365.com',1800,'2018-5-6')
insert into A ([姓名],[訂單數],[訂單日期]) values ('www.maomao365.com',1800,'2018-5-6')
insert into A ([姓名],[訂單數],[訂單日期]) values ('小張',100,'2013-5-6')
insert into A ([姓名],[訂單數],[訂單日期]) values ('小明',2600,'2013-1-6')
insert into A ([姓名],[訂單數],[訂單日期]) values ('小明',1800,'2013-5-6')
insert into A ([姓名],[訂單數],[訂單日期]) values ('小李',888,'2017-3-6')
go

/*row_number 返回分組後的連續排序,不會出現重複的排序值*/
select row_number() over(partition by [姓名] order by [訂單日期] desc ) as keyId,* from A 

/*rank 返回分組後的連續排序,會出現跳躍排序值*/
select rank() over(partition by [姓名] order by [訂單日期] desc ) as keyId,* from A 

/*dense_rank 返回分組後的連續排序,不會出現跳躍排序值,但是會出現重複的排序值*/
select dense_rank() over(partition by [姓名] order by [訂單日期] desc ) as keyId,* from A 

go
truncate table A
drop     table A 
mssql_sqlserver_row_number_rank_dense_rank用法簡介