SQL 2005新增加相關函數 :
ROW_NUMBER,RANK,DENSE_RANK、NTILE
窗口函數
OVER (
[ <PARTITION BY clause> ] ----分區列
[ <ORDER BY clause> ] ---排序列
[ <ROW or RANGE clause> ] ---SQL Server 2012 到 SQL Server 2014
)
本文介紹窗口函數與以上四個函數的配合使用
---創建表初始化查詢語句
CREATE TABLE YSH
(
lev1 VARCHAR(10),
lev2 VARCHAR(10),
lvalue VARCHAR(10)
)
INSERT INTO YSH (lev1,lev2,lvalue) VALUES ('A','A1','lvalue1')
INSERT INTO YSH (lev1,lev2,lvalue) VALUES ('A','A1','lvalue2')
INSERT INTO YSH (lev1,lev2,lvalue) VALUES ('A','A1','')
INSERT INTO YSH (lev1,lev2,lvalue) VALUES ('A','A2','lvalue1')
INSERT INTO YSH (lev1,lev2,lvalue) VALUES ('A','A2','lvalue2')
INSERT INTO YSH (lev1,lev2,lvalue) VALUES ('B','B1','')
INSERT INTO YSH (lev1,lev2,lvalue) VALUES ('B','B2','lvalueB2')
1、ROW_NUMBER()
PARTITION BY 表示分區,有分區後不同的分區編號都會從1進行編號
ORDER BY 按列排序的方式
SELECT *,
ROW_NUMBER() OVER(ORDER BY lev1,lev2) Lev2NUM,
ROW_NUMBER() OVER(PARTITION BY lev1 ORDER BY lev1,lev2) Lev1NUM,
ROW_NUMBER() OVER(PARTITION BY lev1,lev2 ORDER BY lev1,lev2) Lev1NUM1
FROM YSH
以上查詢執行結果無分區時編號依次增長;按lev1分區時,lev1值變更後編號從1開始重新編號;按lev1,lev2組合分區時,兩列任何值變更均從新編號
注:此函數的窗口函數中必須存在order by 若不存在則報錯。
2、RANK() 排名
PARTITION BY 表示分區,有分區後不同的分區編號都會從1進行編號
ORDER BY 按列排序的方式 若值相同則編號也相同。
SELECT *,
RANK() OVER(ORDER BY lev1)
FROM YSH
以上查詢結果因爲A 有5個相同的值按排名不分前後,但是B的排名在A後面則值爲6
3、DENSE_RANK() 密集排名
SELECT *,
DENSE_RANK() OVER(ORDER BY lev1)
FROM YSH
以上執行查詢結果是相同的排名相同,但是B的排名是緊接着A的編號繼續增加的。
4、NTILE(int) 平均分組
NTILE(expr) OVER([PARTITION BY]ORDER BY) :把有序的數據集平均分配到 expr指定的數量的桶中,將桶號分配給每一行;如果不能平均分配,則較小桶號的桶分配額外的行,並且各個桶中能放的行數最多相差。