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

 

在實際的項目開發中,咱們常用分組函數,對組內數據進行羣組後,而後進行組內排序:
如:
1:取出一個客戶一段時間內,最大訂單數的行記錄
2: 取出一個客戶一段時間內,最後一次銷售記錄的行記錄
————————————————
下文將講述三個分組函數 row_number rank dense_rank的用法 ,
以上三個函數的功能爲:返回行數據在」分組數據內」的排列值sql



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用法簡介

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

相關文章
相關標籤/搜索