row_number( )、rank( )、,DENSE_RANK( )、ntile( )下面以实例分别简单讲解。
1
.row_number( )
先来点数据,先建个表
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
'
)
ROW_NUMBER()
OVER
(
ORDER
BY
Age)
AS
[
Row Number by Age
]
,
FirstName,
Age
FROM
Person
--
------------------------ ---------- --------
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
与sql server2000对比:
如果在sql server2000中实现相对麻烦一些,我们可以利用IDENTITY()函数实现,但IDENTITY()函数只能用在sql server2000临时表中,因此需要将数据检索到临时表里。
select
identity
(
int
,
1
,
1
)
as
[
Row Number by Age
]
,FirstName,Age
into
#A
from
Person
order
by
Age
select
*
from
#A
drop
table
#a
如果不想按年龄排序,可以这样写
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
注意,姓名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了。
与sql server2000对比:
出现了RANK()函数实在是方便,在sql server2000里实现排序并列的问题麻烦很多。
select
[
Rank by Age
]
=
isnull
((
select
count
(
*
)
from
person
where
Age
>
A.Age),
0
)
+
1
,FirstName,Age
from
Person A
order
by
[
Rank by Age
]
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段