在實際的項目開發中,咱們常用分組函數,對組內數據進行羣組後,而後進行組內排序:
如:
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