ROW_NUMBER() OVER函数的基本用法

xlh           row_num
1700              1
1500              2
1085              3
710                4

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)

empid       deptid      salary
----------- ----------- ---------------------------------------
1           10          5500.00
2           10          4500.00
3           20          1900.00
4           20          4800.00
5           40          6500.00
6           40          14500.00
7           40          44500.00
8           50          6500.00
9           50          7500.00

empid       deptid      salary                                  rank
----------- ----------- --------------------------------------- --------------------
1           10          5500.00                                 1
2           10          4500.00                                 2
4           20          4800.00                                 1
3           20          1900.00                                 2
7           40          44500.00                               1
6           40          14500.00                               2
5           40          6500.00                                 3
9           50          7500.00                                 1
8           50          6500.00                                 2

SQL脚本：

SELECT *, Row_Number() OVER (partition by deptid ORDER BY salary desc) rank FROM employee

通常，开发者和管理员在一个查询里，用临时表和列相关的子查询来计算产生行号。现在SQL Server 2005提供了一个函数，代替所有多余的代码来产生行号。

我们假设有一个资料库[EMPLOYEETEST]，资料库中有一个表[EMPLOYEE]，你可以用下面的脚本来产生资料库，表和对应的数据。

USE [MASTER]
GO

IF  EXISTS (SELECT NAME FROM SYS.DATABASES WHERE NAME = N'EMPLOYEE TEST')
DROP DATABASE [EMPLOYEE TEST]
GO
CREATE DATABASE [EMPLOYEE TEST]
GO
USE [EMPLOYEE TEST]
GO

IF  EXISTS SELECT * FROM SYS.OBJECTS HERE OBJECT_ID = OBJECT_ID(N'[DBO].[EMPLOYEE]') AND TYPE IN (N'U'))
DROP TABLE [DBO].[EMPLOYEE]
GO

CREATE TABLE EMPLOYEE (EMPID INT, FNAME VARCHAR(50),LNAME VARCHAR(50))
GO
INSERT INTO EMPLOYEE  (EMPID, FNAME, LNAME) VALUES (2021110, 'MICHAEL', 'POLAND')
INSERT INTO EMPLOYEE  (EMPID, FNAME, LNAME) VALUES (2021110, 'MICHAEL', 'POLAND')
INSERT INTO EMPLOYEE  (EMPID, FNAME, LNAME) VALUES (2021115, 'JIM', 'KENNEDY')
INSERT INTO EMPLOYEE  (EMPID, FNAME, LNAME) VALUES (2121000, 'JAMES', 'SMITH')
INSERT INTO EMPLOYEE  (EMPID, FNAME, LNAME) VALUES (2011111, 'ADAM', 'ACKERMAN')
INSERT INTO EMPLOYEE  (EMPID, FNAME, LNAME) VALUES (3015670, 'MARTHA', 'LEDERER')
INSERT INTO EMPLOYEE  (EMPID, FNAME, LNAME) VALUES (1021710, 'MARIAH', 'MANDEZ')
GO

我们可以用下面的脚本查询EMPLOYEE表。

SELECT EMPID, RNAME, LNAME FROM EMPLOYEE

这个查询的结果应该如图1.0

 2021110 MICHAEL POLAND 2021110 MICHAEL POLAND 2021115 JIM KENNEDY 2121000 JAMES SMITH 2011111 ADAM ACKERMAN 3015670 MARTHA LEDERER 1021710 MARIAH MANDEZ

在SQL Server 2005，要根据这个表中的数据产生行号，我通常使用下面的查询。

SELECT ROWID=IDENTITY(int,1,1) , EMPID, FNAME, LNAME INTO EMPLOYEE2 FROM EMPLOYEE ORDER BY EMPID

这个查询创建了一个新的表，用identify函数来产生行号。我们用下面的查询来看看这个表的数据。

SELECT ROWID, EMPID, FNAME, LNAME FROM EMPLOYEE2

上面的查询结果如图1.1

 1 1021710 MARIAH MANDEZ 2 2011111 ADAM ACKERMAN 3 2021110 MICHAEL POLAND 4 2021110 MICHAEL POLAND 5 2021115 JIM KENNEDY 6 2121000 JAMES SMITH 7 3015670 MARTHA LEDERER

这个查询结果很明显EMP=2021110的行是重复的数据。

要删除EMPID=2021110的重复数据，我们必须在EMPLOYEE2表中删除，不能直接在EMPLOYEE中删除。

SQL Server 2005提供了一个新的函数（Row_Number()）来产生行号。我们可以使用这个新函数来删除原来表中的重复数据，只用通常的表达方式再加上Row_Number()函数。

让我们用Row_Number()函数根据EMPID来产生ROWID。

SELECT ROW_NUMBER() OVER (ORDER BY EMPID ASC) AS ROWID, * FROM EMPLOYEE

上面的查询结果如图1.2

 1 1021710 MARIAH MANDEZ 2 2011111 ADAM ACKERMAN 3 2021110 MICHAEL POLAND 4 2021110 MICHAEL POLAND 5 2021115 JIM KENNEDY 6 2121000 JAMES SMITH 7 3015670 MARTHA LEDERER

在这个结果中，我们可以区别EMPID是2021110的重复数据。

我们可以用通用表查询表达式和Row_Numner()函数来选出重复的那行数据。

WITH [EMPLOYEE ORDERED BY ROWID] AS
(SELECT ROW_NUMBER() OVER (ORDER BY EMPID ASC) AS ROWID, * FROM EMPLOYEE)
SELECT * FROM [EMPLOYEE ORDERED BY ROWID] WHERE ROWID =4

 4 2021110 MICHAEL POLAND

这一行重复的数据可以用下面这个通用表和Row_Number()函数来删除。

WITH [EMPLOYEE ORDERED BY ROWID] AS
(SELECT ROW_NUMBER() OVER (ORDER BY EMPID ASC) AS ROWID, * FROM EMPLOYEE)
DELETE FROM [EMPLOYEE ORDERED BY ROWID] WHERE ROWID =4

删除以后，我们可以用下面的查询语句看一下结果。

SELECT * FROM EMPLOYEE

这个查询结果如图1.4

 2021110 MICHAEL POLAND 2021115 JIM KENNEDY 2121000 JAMES SMITH 2011111 ADAM ACKERMAN 3015670 MARTHA LEDERER 1021710 MARIAH MANDEZ

这里我们可以看到，重复的数据已经被删除了。

总结

• 本文已收录于以下专栏：

[数据库]ROW_NUMBER() OVER函数的基本用法

（1）ROW_NUMBER() OVER(ORDER BY COLUMN) 通常，开发者和管理员在一个查询里，用临时表和列相关的子查询来计算产生行号。现在SQL Server 2005提供了一个函数...
• SunnyYoona
• 2014年08月02日 10:07
• 1679

mysql 之 row_number() over ()

SET @rn=0; SET @last_deptno=0; SELECT deptno, empno, ename, sal, IF(@las...
• jgmydsai
• 2014年10月11日 17:33
• 3231

分组去重ROW_NUMBER() OVER函数的基本用法

• nieyan9900
• 2013年11月21日 11:32
• 1258

Oracle数据库 row_number() over() 函数使用说明

row_number() over(partition by COLUMN_NAME1 order by COLUMN_NAME2 DESC)  含义：从1开始，为每一条分组记录返回一个数字 ...
• shuaishifu
• 2014年08月08日 16:09
• 3731

详述 SQL 中的 distinct 和 row_number() over() 的区别及用法

1 前言在咱们编写 SQL 语句操作数据库中的数据的时候，有可能会遇到一些不太爽的问题，例如对于同一字段拥有相同名称的记录，我们只需要显示一条，但实际上数据库中可能含有多条拥有相同名称的记录，从而在检...
• qq_35246620
• 2017年02月22日 16:29
• 11122

mysql实现oracle 分析函数row_number()over()

• adosea
• 2016年05月20日 10:05
• 389

排名函数(ROW_NUMBER、RANK、DENSE_RANK)及OVER子句

--在部门内新水排名（如果有相同名次，用dense_rank) SELECT row_number() over (PARTITION BY t.deptno  --按部门分组 ORDER BY...
• mine3333
• 2015年12月07日 15:48
• 677

PostgreSQL ROW_NUMBER() OVER()

• luojinbai
• 2015年04月16日 18:07
• 7933

oracle row_number函数操作（含实例）

oracle中row_number() over (partition by a order by b)结构的讲解和一个简单实例
• u013125075
• 2016年08月24日 19:41
• 1125

DB2中的ROW_NUMBER() OVER()函数用法

row_number() over()分组排序功能：      在使用 row_number() over()函数时候，over()里头的分组以及排序的执行晚于 where group by  ord...
• TUBER727
• 2013年10月12日 14:34
• 4504

举报原因： 您举报文章：ROW_NUMBER() OVER函数的基本用法 色情 政治 抄袭 广告 招聘 骂人 其他 (最多只允许输入30个字)