mssql sqlserver 分組排序函式row_number、rank、dense_rank用法簡介及說明
阿新 • • 發佈:2018-11-04
轉載: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