SQL 2005新增的几个函数之学习

代码
今天学习了sql server 2005新增的几个函数,分别是row_number(),rank,DENSE_RANK,ntile,下面以例子
分别简单讲解之

1 .row_number
   先来点数据,先建个表
  
SET  NOCOUNT  ON
CREATE   TABLE  Person(
FirstName 
VARCHAR ( 10 ),
Age 
INT ,
Gender 
CHAR ( 1 ))
INSERT   INTO  Person  VALUES  ( ' Ted ' , 23 , ' M ' )
INSERT   INTO  Person  VALUES  ( ' John ' , 40 , ' M ' )
INSERT   INTO  Person  VALUES  ( ' George ' , 6 , ' M ' )
INSERT   INTO  Person  VALUES  ( ' Mary ' , 11 , ' F ' )
INSERT   INTO  Person  VALUES  ( ' Sam ' , 17 , ' M ' )
INSERT   INTO  Person  VALUES  ( ' Doris ' , 6 , ' F ' )
INSERT   INTO  Person  VALUES  ( ' Frank ' , 38 , ' M ' )
INSERT   INTO  Person  VALUES  ( ' Larry ' , 5 , ' M ' )
INSERT   INTO  Person  VALUES  ( ' Sue ' , 29 , ' F ' )
INSERT   INTO  Person  VALUES  ( ' Sherry ' , 11 , ' F ' )
INSERT   INTO  Person  VALUES  ( ' Marty ' , 23 , ' F ' )
直接用例子说明问题
SELECT  ROW_NUMBER()  OVER  ( ORDER   BY  Age)  AS   [ Row Number by Age ] ,
FirstName,
Age
FROM  Person
出现的数据如下 Row 
Number   by  Age    FirstName  Age
-- ------------------ ---------- -----------
1                     Larry       5
2                     Doris       6
3                     George      6
4                     Mary        11
5                     Sherry      11
6                     Sam         17
7                     Ted         23
8                     Marty       23
9                     Sue         29
10                    Frank       38
11                    John        40
 
可以观察到,是根据年龄升序排列了,并且row_number()是给出了序列号了,这个序列号被重命名为Row 
Number   by  Age,
 
如果不想按年龄排序,可以这样写SELECT ROW_NUMBER() 
OVER  ( ORDER   BY  ( SELECT   1 ))  AS   [ Row Number by Record Set ] ,
FirstName,
Age
FROM  Person

另外一个例子SELECT ROW_NUMBER() 
OVER  (PARTITION  BY  Gender  ORDER   BY  Age)  AS   [ Partition by Gender ]
FirstName,
Age,
Gender
FROM  Person这里是按性别划分区间了,同一性别再按年龄来排序,输出结果如下
Partition 
by  Gender  FirstName  Age         Gender
-- ------------------ ---------- ----------- ------
1                     Doris       6            F
2                     Mary        11           F
3                     Sherry      11           F
4                     Sue         29           F
1                     Larry       5            M
2                     George      6            M
3                     Sam         17           M
4                     Ted         23           M
5                     Marty       23           M
6                     Frank       38           M
7                     John        40           M

注意,姓名M开始,序号又从1,
2 ,3开始了
2  RANK函数  先看例子SELECT RANK()  OVER  ( ORDER   BY  Age)  AS   [ Rank by Age ] ,
FirstName,
Age
FROM  Person
输出如下
Rank 
by  Age          FirstName  Age
-- ------------------ ---------- -----------
1                     Larry       5
2                     Doris       6
2                     George      6
4                     Mary        11
4                     Sherry      11
6                     Sam         17
7                     Ted         23
7                     Marty       23
9                     Sue         29
10                    Frank       38
11                    John        40

看到了么,同年岭的话,将有相同的顺序,顺序成1,
2 , 2 ,4了SELECT RANK()  OVER  (PARTITION  BY  Gender  ORDER   BY  Age)  AS   [ Partition by Gender ]
FirstName, Age, Gender 
FROM  Person输出为

Partition 
by  Gender  FirstName  Age         Gender
-- ------------------ ---------- ----------- ------
1                     Doris       6            F
2                     Mary        11           F
2                     Sherry      11           F
4                     Sue         29           F
1                     Larry       5            M
2                     George      6            M
3                     Sam         17           M
4                     Ted         23           M
4                     Marty       23           M
6                     Frank       38           M
7                     John        40           M

可以看到,按性别分组了,每个性别分组里,继续是用了rank函数

3  DENSE_RANK 函数
   
SELECT  DENSE_RANK()  OVER  ( ORDER   BY  Age)  AS   [ Dense Rank by Age ]
       FirstName, 
       Age
  
FROM  Person
输出结果为
Dense Rank 
by  Age    FirstName  Age
-- ------------------ ---------- -----------
1                     Larry       5
2                     Doris       6
2                     George      6
3                     Mary        11
3                     Sherry      11
4                     Sam         17
5                     Ted         23
5                     Marty       23
6                     Sue         29
7                     Frank       38
8                     John        40

看到了么,和rank函数区别是,顺序始终是连续的,Doris 和George同年,都是排第2位,但之后的mary不象rank函数那样排第4,而是排第3位了


4  ntile函数
  

SELECT  FirstName,
Age,
NTILE(
3 OVER  ( ORDER   BY  Age)  AS   [ Age Groups ]
FROM  Person

 输出
 

FirstName  Age         Age Groups
-- -------- ----------- --------------------
Larry       5             1
Doris      
6             1
George     
6             1
Mary       
11            1
Sherry     
11            2
Sam        
17            2
Ted        
23            2
Marty      
23            2
Sue        
29            3
Frank      
38            3
John       
40            3

这个函数按照ntile(n)中的N,把记录强制分成多少段,11条记录现在分成3段了,lary到mary是第1
段,sherry到maty是第2段,sue到john是第3段了

 

你可能感兴趣的:(sql)