语法:ROW_NUMBER() OVER(PARTITION BY COLUMN ORDER BY COLUMN)
简单的说row_number()从1开始,为每一条分组记录返回一个数字,这里的ROW_NUMBER() OVER (ORDER BY xlh DESC) 是先把xlh列降序,再为降序以后的没条xlh记录返回一个序号。
示例:
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
转自:http://www.cnblogs.com/digjim/archive/2006/09/20/509344.html
我们知道,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]
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
图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
这里我们可以看到,重复的数据已经被删除了。
总结
分享到:
相关推荐
cmd-bat-批处理-脚本-rimraf.zip
该资源文件详细介绍了如何在ADS软件中进行混频器仿真,内容涵盖了仿真设置、参数调整、结果分析等多个方面。
cmd-bat-批处理-脚本-Messagebox_Cancel_TryAgain_Continue.zip
内容概要:本文详细介绍了如何使用C#客户端实现OpcUa通讯,具体包括远程连接KEPserverEX服务器的方法及其应用。文中不仅提供了详细的环境准备工作指导,还给出了具体的代码示例用于创建会话和连接服务器,最后通过UaExpert测试工具验证了整个流程的有效性。这是一套亲测稳定高效的解决方案,适用于工业自动化领域的数据传输和控制。 适合人群:从事工业自动化领域的研发人员和技术爱好者,尤其是那些有C#编程经验并对OpcUa通讯感兴趣的开发者。 使用场景及目标:①帮助开发者掌握C#客户端连接KEPserverEX服务器的具体方法;②提供实用的代码示例和测试工具使用指南,便于快速上手;③确保数据传输的安全性和稳定性,提高工作效率。 其他说明:文章强调了环境准备的重要性,包括安装必要的开发工具和库,同时也指出了可能遇到的问题及解决办法。此外,还提到了UaExpert作为一款优秀的测试工具,在验证连接和数据交互方面的优势。
人工智能中的自动逻辑推理.zip
cmd-bat-批处理-脚本-os2_cid_install.zip
在武汉大学大地测量学基础的编程作业中,我已完成相关任务。通过使用教材中的算例进行验证,程序运行结果的误差极小,这充分证明了程序的准确性和可靠性。在公式推导过程中,我严格遵循步骤,确保每一步都清晰严谨,从而保证了最终结果的高精度。作业中还提供了灵活的选择,用户可以根据自己的需求选择正算或反算操作,并且可以手动输入任意坐标,方便进行多样化的计算和验证。
警 院指挥教学数字训练系统设计——公 安院校电子沙盘教学系统设计.zip
cmd-bat-批处理-脚本-un-java.zip
cmd-bat-批处理-脚本-SetForegroundWindow.zip
内容概要:本文详细介绍了GSP软件在航空发动机和燃气轮机模型设计中的应用。首先,讨论了如何利用GSP软件构建不同类型的航空发动机(如涡扇、涡喷、涡轴)和燃气轮机模型,涵盖了从进气道到涡轮各组成部分的建模。接着,阐述了稳态特性的循环计算方法,包括空气、燃油、燃气等组分的变换及其能量转换和物质交换的计算。最后,探讨了瞬态性能计算和部件性能衰退降级仿真,通过时间序列分析和动态仿真模块,模拟发动机在不同工况下的瞬态响应和故障数据,从而全面评估发动机的性能。 适合人群:从事航空发动机和燃气轮机研究的设计工程师、研究人员和技术专家。 使用场景及目标:适用于需要深入了解航空发动机和燃气轮机构造、稳态和瞬态性能的研究和开发项目。目标是提高对发动机工作原理的理解,优化设计流程,提升性能预测精度。 其他说明:文中提到的技术手段不仅限于理论分析,还包括实际操作层面的代码实现,帮助读者掌握具体的建模和仿真技巧。
cmd-bat-批处理-脚本-installtrusted.zip
1.版本:matlab2014/2019a/2024a 2.附赠案例数据可直接运行。 3.代码特点:参数化编程、参数可方便更改、代码编程思路清晰、注释明细。 4.适用对象:计算机,电子信息工程、数学等专业的大学生课程设计、期末大作业和毕业设计。
威布尔杂波下扩展目标检测.zip
remotesensing-13-04370-v2.pdf
二十四节气之霜降介绍.pptx
2025年网络安全技术漏洞扫描.docx
cmd-bat-批处理-脚本-virtualcam-uninstall.zip
不完备决策表的相对约简算法.pdf
chat-box1.12.3 版本windows专用