容易遗忘的一些小代码之 ROW_NUMBER 和去重
2013-01-07 15:40
537 查看
ROW_NUMBER 的使用基本上倒不会遗忘了, 这是很久以前的代码库了, 整理出来对初学者有帮助.
如果去继续研究研究 SQL Server 2012 中的Window Function 新特性, 就会发现里面还有更多很强大的东东, 很多内容和这里的 ROW_NUMBER 的概念或者使用方式有些相似.
理解了ROW_NUMBER 以及 PARTITION BY 的使用再去看 2012的 Windows Function 新特性的话会比较容易些.
![](http://images.cnitblog.com/blog/477275/201301/07153448-2f05d7af57cf490281bab855db3bb505.png)
![](http://images.cnitblog.com/blog/477275/201301/07153517-dd2ed3a62e0943c5b15b67f503f87aba.png)
![](http://images.cnitblog.com/blog/477275/201301/07153543-46031755760645d9b2b26392ae8b2239.png)
![](http://images.cnitblog.com/blog/477275/201301/07153607-2f87f1749ac44302b8a12c3883918db1.png)
通过了上面的这个小例子,再看看去重就很简单了.
![](http://images.cnitblog.com/blog/477275/201301/07153800-f0fa7fb1e26c4788a553fad80df4e7c8.png)
![](http://images.cnitblog.com/blog/477275/201301/07153836-c3cbbd48ce2b410b8789f08db1925e8e.png)
![](http://images.cnitblog.com/blog/477275/201301/07153856-d766ec8ae114455c9b45c8200ed64c2c.png)
如果去继续研究研究 SQL Server 2012 中的Window Function 新特性, 就会发现里面还有更多很强大的东东, 很多内容和这里的 ROW_NUMBER 的概念或者使用方式有些相似.
理解了ROW_NUMBER 以及 PARTITION BY 的使用再去看 2012的 Windows Function 新特性的话会比较容易些.
-- ROW_NUMBER function DECLARE @DEMO TABLE ( Name VARCHAR(15), ADDR1 VARCHAR(50), ADDR2 VARCHAR(50), CITY VARCHAR(50), ZIP CHAR(6) ) -- Insert testing records INSERT INTO @DEMO VALUES ('Zhang San','Leshan Road 33','','Shanghai','200081'), ('Li Si','Zhaojiabang Road 23','Nan song Street 9002','Shanghai','200083'), ('Wang Wu','Huashan Road 27','Weihai zhong Road 1039','Shanghai','200081'), ('Sun liu','Jiaoda dong Round 12','Gao liangqiao xiejie 19','Beijing','100023'), ('Yang Qi','Zhong guan cun nan A39','','Beijing','100009'), ('Zhu Ba','Cuihua nan 30','haiding road 32','Beijing','100103'), ('Huang Jiu','Lv you Road 33','Huan dong jie 39','Wuhan','420021') -- Original query SELECT * FROM @DEMO
![](http://images.cnitblog.com/blog/477275/201301/07153448-2f05d7af57cf490281bab855db3bb505.png)
-- Only to set row number for each record. SELECT ROW_NUMBER() OVER(ORDER BY addr.city) AS 'ID', addr.Name, addr.ADDR1, addr.CITY, addr.ZIP FROM @DEMO AS addr
![](http://images.cnitblog.com/blog/477275/201301/07153517-dd2ed3a62e0943c5b15b67f503f87aba.png)
-- Set group first, then set row number for each record under the group - city SELECT ROW_NUMBER() OVER (PARTITION BY addr.CITY ORDER BY addr.CITY) AS 'ID', addr.Name, addr.ADDR1, addr.CITY, addr.ZIP FROM @DEMO AS addr
![](http://images.cnitblog.com/blog/477275/201301/07153543-46031755760645d9b2b26392ae8b2239.png)
-- Set group first, then set row number for each record under the group - city and zip SELECT ROW_NUMBER() OVER (PARTITION BY addr.CITY, addr.ZIP ORDER BY addr.CITY) AS 'ID', addr.Name, addr.ADDR1, addr.CITY, addr.ZIP FROM @DEMO AS addr
![](http://images.cnitblog.com/blog/477275/201301/07153607-2f87f1749ac44302b8a12c3883918db1.png)
通过了上面的这个小例子,再看看去重就很简单了.
-- Remove duplicated records DECLARE @DupDemo TABLE ( A VARCHAR(15), B VARCHAR(15), C VARCHAR(15) ) -- Insert testing records INSERT INTO @DupDemo VALUES ('1','a','2'), ('1','a','1'), ('2','c','6'), ('2','c','3'), ('1','a','1'), ('3','b','3') -- Original Records SELECT * FROM @DupDemo
![](http://images.cnitblog.com/blog/477275/201301/07153800-f0fa7fb1e26c4788a553fad80df4e7c8.png)
-- Show the duplicated records, only to check column A and B. SELECT ROW_NUMBER() OVER(PARTITION BY A, B ORDER BY C) AS ID, A, B, C FROM @DupDemo
![](http://images.cnitblog.com/blog/477275/201301/07153836-c3cbbd48ce2b410b8789f08db1925e8e.png)
-- Delete the duplicated records DELETE D FROM( SELECT ROW_NUMBER() OVER(PARTITION BY A, B ORDER BY C) AS ID, A, B, C FROM @DupDemo )D WHERE D.ID > 1 -- After delete operation SELECT * FROM @DupDemo
![](http://images.cnitblog.com/blog/477275/201301/07153856-d766ec8ae114455c9b45c8200ed64c2c.png)
-- Show DEMO 2 DELETE FROM @DupDemo -- Insert test records INSERT INTO @DupDemo VALUES ('1','a','2'), ('1','a','1'), ('2','c','6'), ('2','c','3'), ('1','a','1'), ('3','b','3'); -- With TEMP table WITH Dup AS ( SELECT ROW_NUMBER() OVER(PARTITION BY A, B ORDER BY C) AS ID, A, B, C FROM @DupDemo ) DELETE FROM Dup WHERE ID > 1; -- Show records after delete operation. SELECT * FROM @DupDemo
![](http://images.cnitblog.com/blog/477275/201301/07153921-3c7522c8194e40e9b4a7591322420a42.png)
相关文章推荐
- 容易遗忘的一些小代码之 Cross apply and Outer apply
- 容易遗忘的一些小代码之 Merge Operation and Output Clause
- 容易遗忘的一些小代码之 PIVOT 和 UNPIVOT
- <android> 常用但容易忘记的一些代码和技巧 汇总(个人笔记)
- 【C/C++】C++中一些容易被人忽略的东西 之一 【寥寥代码,让您分清引用和指针】
- ROW_NUMBER() over(order by id)分页存储过程 代码直接可用
- c/c++一些容易遗忘的知识点(不断补充)
- 1 开发一个注重性能的JDBC应用程序不是一件容易的事. 当你的代码运行很慢的时候JDBC驱动程序并不会抛出异常告诉你。 本系列的性能提示将为改善JDBC应用程序的性能介绍一些基本的指导原则,这其中的原则已经被许多现有的JDBC应用程序编译运行并验证过。 这些指导原则包括: 正确的使用数据库MetaData方法 只获取需要的数据 选用最佳性能的功能 管理连
- 一个基于ROW_NUMBER()的通用分页存储过程代码
- 别人家的Python代码——记录一些容易忘的姿势
- 一些有意思,有深度,容易错的代码收集
- SQLite的一些须知和容易遗忘的知识点
- HM编码器代码阅读(3)——一些比较容易混淆的类和结构
- 【代码保留】用于生成RowNumber的程序
- 对ROW_NUMBER() 的一些理解及随想
- sqlserver 通用存储过程分页代码(附使用ROW_NUMBER()和不使用ROW_NUMBER()两种情况性能分析)
- 【代码保留】用于生成RowNumber的程序
- 一些简单,但是常用到,又容易遗忘的知识点
- 容易被忽视的:代码merge的一些rules
- 一些容易被忽视和遗忘的SQL 技巧(SQL SERVER)