SQL Server中Row_number(),Rank()和dense_rank()的用法
来源:互联网 发布:python中的守护线程 编辑:程序博客网 时间:2024/05/02 04:28
出处:http://www.cnblogs.com/digjim/archive/2006/09/20/509344.html
1. Row_Number()是按指定的字段顺序,生成行号。如下图所示:
加入Partition by后,则按指定的字段重新生成行号。
2.Rank()按指定的字段生成排名信息,出现重复的排名后,后面的排名跳过重复的记录数。如下图所示:
3.Dense_Rank()按指定的字段生成排名信息,出现重复的排名后,后面的排名依然是连续的。如下图所示:
Rank()和Dense_Rank()同样也可以应用Partion By子句,
我们知道,SQL Server 2005和SQL Server 2000 相比较,SQL Server 2005有很多新特性。这篇文章我们要讨论其中的一个新函数Row_Number()。数据库管理员和开发者已经期待这个函数很久了,现在终于等到了!
通常,开发者和管理员在一个查询里,用临时表和列相关的子查询来计算产生行号。现在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]GOIF 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
图1.0
在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
图1.1
这个查询结果很明显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
图1.2
在这个结果中,我们可以区别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
上面的查询结果如图1.3
4
2021110
MICHAEL
POLAND
图1.3
这一行重复的数据可以用下面这个通用表和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
图 1.4
这里我们可以看到,重复的数据已经被删除了。
总结
在这篇文章中,我们讨论了SQL Server 2005 的新特性Row_Number()函数,还有通常的表表达式,然后如何使用这两个来删除重复的行。
______________________________________________
原文:http://www.databasejournal.com/features/mssql/article.php/3577481
- SQL Server中Row_number(),Rank()和dense_rank()的用法
- SQL中ROW_NUMBER()/RANK() /DENSE_RANK() OVER函数的基本用法
- MSSQL ROW_NUMBER()、RANK()和DENSE_RANK()的用法
- SQL Server中Row_number() 和 Rank() 的用法
- ROW_NUMBER、RANK、DENSE_RANK的用法
- ROW_NUMBER、RANK、DENSE_RANK的用法
- ROW_NUMBER、RANK、DENSE_RANK的用法
- sql server 排名函数 row_number,rank,dense_rank和ntile
- sql server中dense_rank和row_number
- SQL Server 2005四个新的排序函数: ROW_NUMBER、RANK、DENSE_RANK 和 NTILE
- SQL Server 2005四个新的排序函数: ROW_NUMBER、RANK、DENSE_RANK 和 NTILE
- SQL Server 2005四个新的排序函数: ROW_NUMBER、RANK、DENSE_RANK 和 NTILE
- SQL Server 2005四个新的排序函数: ROW_NUMBER、RANK、DENSE_RANK 和 NTILE
- SQL Server 2005 四个排名函数(row_number、rank、dense_rank和ntile)的比较
- SQL2005中row_number( )、rank( )、dense_rank( )、ntile( )函数的用法(2)
- SQL2005中row_number( )、rank( )、dense_rank( )、ntile( )函数的用法
- SQL2005中row_number( )、rank( )、dense_rank( )、ntile( )函数的用法
- SQL2005中row_number( )、rank( )、dense_rank( )、ntile( )函数的用法
- AlertBox 弹出层(信息提示框)效果
- C++语言实现的WebService开发库—gsoap应用实例
- C++中将string类型转换为int, float, double类型 主要通过以下几种方式:
- Linux的nfs及mount使用方法
- 隐藏UITableView多余的分割线
- SQL Server中Row_number(),Rank()和dense_rank()的用法
- Yii Framework CGridView详解
- 0009算法笔记——【动态规划】动态规划与斐波那契数列问题,最短路径问题
- Putty管理私钥文件
- 套打印
- s2sh整合
- UML类图和类的关系学习
- WebView 私有api
- hdu 1080 Human Gene Functions(dp)