SQL 序號列ROW_NUMBER,RANK,DENSE_RANK、NTILE

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指定的數量的桶中,將桶號分配給每一行;如果不能平均分配,則較小桶號的桶分配額外的行,並且各個桶中能放的行數最多相差。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章