select * from ( select * ,row_number() over(partition by DDID order by DDID desc) y from LDZBSCJH where HTBH='V01461' ) as b where y <>1
SqlServer四種排序:ROW_NUMBER()/RANK()/DENSE_RANK()/ntile() over()
先看一下最簡單的sql語句以及最原始的效果圖:
SELECT a.userName,a.userid FROM dbo.t_user a
【四種排序方式】
1.ROW_NUMBER()排序
我們將這幾行數據進行簡單的排序,另給一個新的列RN
SELECT a.userName,a.userid,ROW_NUMBER()OVER (order by a.userName) AS RN FROM dbo.t_user a
這時,我想針對名字這一列,將重復的數據以1開頭排序,不存在重復的就是1
SELECT a.userName,a.userid,ROW_NUMBER()OVER (partition by a.userName ORDER by a.userName) AS RN FROM dbo.t_user a
2.RANK()排序
SELECT a.userName,a.userid,RANK()OVER (ORDER by a.userName) AS RN FROM dbo.t_user a
這時排序的應該為3的值,因為出現重復數據,所以也變成了2,但是最后的行數和最后編號的值是一樣的。
3.DENSE_RANK()排序
SELECT a.userName,a.userid,DENSE_RANK()over (ORDER by a.userName) AS RN FROM dbo.t_user a
保持了重復的數據RN值相同,但值得注意的是第4行數據變成了3,也就是說行數和最后的編號是發生了變化的。
SELECT a.userName,a.userid,NTILE(2)over (ORDER by a.userName) AS RN FROM dbo.t_user a
3.NTILE()排序
括號里面是幾,就會分成幾組
例如5行數據,分成2組,就會前面3個,后面2個,默認把多余的行分給前面;分成3組,第一組就會2個,第二組就會2個,第三組就會1個
SELECT a.userName,a.userid,NTILE(2)over (ORDER by a.userName) AS RN FROM dbo.t_user a
SELECT a.userName,a.userid,NTILE(3)over (ORDER by a.userName) AS RN FROM dbo.t_user a
ROW_NUMBER() OVER函數的基本用法
ROW_NUMBER() OVER函數的基本用法
語法:ROW_NUMBER() OVER(PARTITION BY COLUMN ORDER BY COLUMN)
方法/步驟
簡單的說row_number()從1開始,為每一條分組記錄返回一個數字,這里的ROW_NUMBER() OVER (ORDER BY xlh DESC) 是先把xlh列降序,再為降序以后的沒條xlh記錄返回一個序號。
row_number() OVER (PARTITION BY COL1 ORDER BY COL2) 表示根據COL1分組,在分組內部根據 COL2排序,而此函數計算的值就表示每組內部排序后的順序編號(組內連續的唯一的)
實例:
初始化數據
create table employee (empid int ,deptid int ,salary decimal(10,2))insert into employee values(1,10,5500.00)insert into employee values(2,10,4500.00)insert into employee values(3,20,1900.00)insert into employee values(4,20,4800.00)insert into employee values(5,40,6500.00)insert into employee values(6,40,14500.00)insert into employee values(7,40,44500.00)insert into employee values(8,50,6500.00)insert into employee values(9,50,7500.00)
數據顯示為
需求:根據部門分組,顯示每個部門的工資等級
預期結果:
SQL腳本:
SELECT *, Row_Number() OVER (partition by deptid ORDER BY salary desc) rank FROM employee