原文:SQL Server 2008 R2——ROW_NUMBER() 去掉不同行中相同列的重复内容

==================================声明==================================

本文原创,转载在正文中显要的注明作者和出处,并保证文章的完整性。

未经作者同意请勿修改(包括本声明),保留法律追究的权利。

未经作者同意请勿用于学术性引用。

未经作者同意请勿用于商业出版、商业印刷、商业引用。

本文不定期修正完善,为保证内容正确,建议移步原文处阅读。

本文链接:http://www.cnblogs.com/wlsandwho/p/4416222.html

=======================================================================

总是写一些“战5渣”的东西,这次来个“战6渣”的。不然没法混了。

=======================================================================

举个例子,不一定好。

原创例子,必然没有雷同。

这个栗子果然坏了。

=======================================================================

弄成这个样子

=======================================================================

 1 USE tempdb
 2 GO
 3 --------------------------------------------------------------------------
 4 IF OBJECT_ID('Student','U') IS NOT NULL
 5 DROP TABLE Student
 6 GO
 7
 8 CREATE TABLE Student
 9 (
10     StuID NVARCHAR(8) PRIMARY KEY,
11     Name NVARCHAR(5)
12 )
13 GO
14
15 INSERT INTO Student(StuID,Name) VALUES('20080001','Lily')
16 INSERT INTO Student(StuID,Name) VALUES('20080002','Lucy')
17 INSERT INTO Student(StuID,Name) VALUES('20080003','Jack')
18 GO
19 --------------------------------------------------------------------------
20 IF OBJECT_ID('SltCourse','U') IS NOT NULL
21 DROP TABLE SltCourse
22 GO
23
24 CREATE TABLE SltCourse    --SelectiveCourse
25 (
26     ID INT PRIMARY KEY IDENTITY(1,1),
27     StuID NVARCHAR(8),
28     CourseName NVARCHAR(10),
29     Score    INT
30 )
31 GO
32
33 INSERT INTO SltCourse(StuID,CourseName,Score) VALUES('20080003','电脑维修',90)
34 INSERT INTO SltCourse(StuID,CourseName,Score) VALUES('20080003','剪纸',80)
35 INSERT INTO SltCourse(StuID,CourseName,Score) VALUES('20080003','市场策划',95)
36 INSERT INTO SltCourse(StuID,CourseName,Score) VALUES('20080003','信息检索',100)
37
38 INSERT INTO SltCourse(StuID,CourseName,Score) VALUES('20080001','插花',99)
39 INSERT INTO SltCourse(StuID,CourseName,Score) VALUES('20080001','剪纸',96)
40 INSERT INTO SltCourse(StuID,CourseName,Score) VALUES('20080001','刺绣',92)
41
42 INSERT INTO SltCourse(StuID,CourseName,Score) VALUES('20080002','插花',98)
43 GO
44 --------------------------------------------------------------------------
45 SELECT * FROM Student
46 GO
47 SELECT * FROM SltCourse
48 GO
49 --------------------------------------------------------------------------
50 SELECT * FROM Student s,SltCourse sc WHERE s.stuid=sc.stuid
51 GO
52 --------------------------------------------------------------------------
53 WITH ReportCard
54 AS(
55 SELECT s.StuID,s.Name,sc.CourseName,sc.Score FROM Student s,SltCourse sc WHERE s.stuid=sc.stuid
56 )
57 SELECT  CASE WHEN RowNum=1 THEN StuID   ELSE '' END AS ID,
58         CASE WHEN RowNum=1 THEN Name    ELSE '' END AS Name,
59         CourseName,
60         Score
61 FROM (SELECT *,ROW_NUMBER()  OVER (PARTITION BY StuID,Name ORDER BY Score) AS RowNum FROM ReportCard) TBL
62 GO
63 --------------------------------------------------------------------------
64 DROP TABLE Student
65 GO
66 DROP TABLE SltCourse
67 GO

=======================================================================

=======================================================================

然而……(然而……)×N

假如说,有一个字段是DateTime类型,那么可能会出现类似“1900-01-01 00:00:00.000”的东西。

例如下面略微修改过的代码,添加了入学时间(EntranceTime):

 1 USE tempdb
 2 GO
 3 --------------------------------------------------------------------------
 4 IF OBJECT_ID('Student','U') IS NOT NULL
 5 DROP TABLE Student
 6 GO
 7
 8 CREATE TABLE Student
 9 (
10     StuID NVARCHAR(8) PRIMARY KEY,
11     Name NVARCHAR(5),
12     EntranceTime DATETIME
13 )
14 GO
15
16 INSERT INTO Student(StuID,Name,EntranceTime) VALUES('20080001','Lily','2008-08-27')
17 INSERT INTO Student(StuID,Name,EntranceTime) VALUES('20090002','Lucy','2009-08-26')
18 INSERT INTO Student(StuID,Name,EntranceTime) VALUES('20070003','Jack','2007-08-28')
19 GO
20 --------------------------------------------------------------------------
21 IF OBJECT_ID('SltCourse','U') IS NOT NULL
22 DROP TABLE SltCourse
23 GO
24
25 CREATE TABLE SltCourse    --SelectiveCourse
26 (
27     ID INT PRIMARY KEY IDENTITY(1,1),
28     StuID NVARCHAR(8),
29     CourseName NVARCHAR(10),
30     Score    INT
31 )
32 GO
33
34 INSERT INTO SltCourse(StuID,CourseName,Score) VALUES('20070003','电脑维修',90)
35 INSERT INTO SltCourse(StuID,CourseName,Score) VALUES('20070003','剪纸',80)
36 INSERT INTO SltCourse(StuID,CourseName,Score) VALUES('20070003','市场策划',95)
37 INSERT INTO SltCourse(StuID,CourseName,Score) VALUES('20070003','信息检索',100)
38
39 INSERT INTO SltCourse(StuID,CourseName,Score) VALUES('20080001','插花',99)
40 INSERT INTO SltCourse(StuID,CourseName,Score) VALUES('20080001','剪纸',96)
41 INSERT INTO SltCourse(StuID,CourseName,Score) VALUES('20080001','刺绣',92)
42
43 INSERT INTO SltCourse(StuID,CourseName,Score) VALUES('20090002','插花',98)
44 GO
45 --------------------------------------------------------------------------
46 SELECT * FROM Student
47 GO
48 SELECT * FROM SltCourse
49 GO
50 --------------------------------------------------------------------------
51 SELECT * FROM Student s,SltCourse sc WHERE s.stuid=sc.stuid
52 GO
53 --------------------------------------------------------------------------
54 WITH ReportCard
55 AS(
56 SELECT s.StuID,s.Name,s.EntranceTime,sc.CourseName,sc.Score FROM Student s,SltCourse sc WHERE s.stuid=sc.stuid
57 )
58 SELECT  CASE WHEN RowNum=1 THEN StuID          ELSE '' END AS ID,
59         CASE WHEN RowNum=1 THEN Name            ELSE '' END AS Name,
60         CASE WHEN RowNum=1 THEN EntranceTime    ELSE '' END AS EntranceTime,
61         CourseName,
62         Score
63 FROM (SELECT *,ROW_NUMBER()  OVER (PARTITION BY StuID,Name,EntranceTime ORDER BY Score) AS RowNum FROM ReportCard) TBL
64 GO
65 --------------------------------------------------------------------------
66 DROP TABLE Student
67 GO
68 DROP TABLE SltCourse
69 GO

最终显示为:

这肯定不行啊。

让我先想想。

=======================================================================

改成

WITH ReportCard
AS(
SELECT s.StuID,s.Name,s.EntranceTime,sc.CourseName,sc.Score FROM Student s,SltCourse sc WHERE s.stuid=sc.stuid
)
SELECT  CASE WHEN RowNum=1 THEN StuID          ELSE '' END AS ID,CASE WHEN RowNum=1 THEN Name            ELSE '' END AS Name,CASE WHEN RowNum=1 THEN EntranceTime    ELSE cast(nullif('','') as datetime) END AS EntranceTime,CourseName,Score
FROM (SELECT *,ROW_NUMBER()  OVER (PARTITION BY StuID,Name,EntranceTime ORDER BY Score) AS RowNum FROM ReportCard) TBL
GO

则效果为

=======================================================================

但是怎么才能把变成呢?

SQL Server 2008 R2——ROW_NUMBER() 去掉不同行中相同列的重复内容相关推荐

  1. PowerShell 2.0 实践(十二)管理 SQL Server 2008 R2(1)

    DBA可以使用的工具很多,对于SQL Server来说,有查询分析器.事件探查器.命令行工具等,其中SQL语句是重中之重,但是PowerShell的出现使得DBA又多了一种选择. 测试脚本下载 本系列 ...

  2. 安装 SQL Server 2008 R2 的硬件和软件要求(转)

    以下各部分列出了安装和运行 SQL Server 2008 R2 的最低硬件和软件要求.有关 SharePoint 集成模式下的 Analysis Services 的要求的详细信息,请参阅硬件和软件 ...

  3. 如何解决SQL Server 2008 R2中“阻止保存要求重新创建表的更改”的问题!

    今天在讲解SQL Server 2008  R2课程中,有学生遇到一个问题,在SQL Server 2008  R2管理控制台中创建一个新表后,如果再次打开该表进行修改保存时,发现对每个表的修改都不成 ...

  4. SQL Server 2008 R2 下载 序列号

    SQL Server 2008 R2 RTM 中文版 下载地址 http://care.dlservice.microsoft.com/dl/download/1/E/6/1E626796-588A- ...

  5. Android Studio使用webservice远程访问数据库SQL Server 2008 R2

    首先说一下背景,由于目前个人自学Android Studio,参考度娘实现连接DB的方式,总结出目前主流的两种方式: 1)使用jtds直接访问DB数据库(参考:https://blog.csdn.ne ...

  6. SQL Server 2008 R2如何开启数据库的远程连接

    SQL Server 2008 R2如何开启数据库的远程连接 转载于:https://www.cnblogs.com/macT/p/10213025.html

  7. SQL Server 2008 R2中文版快速安装

    SQL Server 2008 R2中文版快速安装 1 实验环境 1)域: 域名为fengxja.com: 域功能级别和林功能级别为Windows server 2003模式. 2)DC01服务器: ...

  8. 2008 r2 sn sqlserver_sqlserver 下载地址(SQL Server 2008 R2 中英文 开发版/企业版/标准版 下载)...

    注:企业版无法安装在xp和win7,开发版才可以! 一. 简体中文 1. SQL Server 2008 R2 Developer (x86, x64, ia64) - DVD (Chinese-Si ...

  9. 完全卸载SQL Server 2008 R2(转)

    系统:Windows 10 以下方法转自:http://www.cnblogs.com/qanholas/p/3804123.html 1.在控制面板卸载Miscrosoft SQL Server 2 ...

最新文章

  1. python中mid_使用Python进行新浪微博的mid和url互相转换实例(10进制和62进制互算)...
  2. 路易斯·罗森伯格与「群体智能」
  3. LeetCode Remove Nth Node From End of List
  4. linux 系统网络服务器组建,配置和管理实训教程 pdf,Linux网络服务器配置管理项目实训教程2...
  5. Mysql sequence使用_MySQL 序列使用_mysql sequence_mysql auto increment
  6. 文件内容、关键字匹配,split 和 indexOf 均可实现
  7. boost::rational模块相关的测试程序
  8. Zotero参考文献管理
  9. 计算机硬盘按不同接口,硬盘接口不同 速度差别竟然这么大
  10. 双人贪吃蛇小游戏C++原创
  11. 2018全球最值得关注的60家半导体公司,7家中国公司新上榜 | 年度榜单
  12. 网页制作篇(智慧树网站马红老师)-基础知识总结2(标记的属性篇)
  13. Firefox中强制复制粘贴的插件
  14. 电脑上怎么批量压缩图片?如何快速批量压缩图片?
  15. 算法创作|什么是数据结构
  16. 安卓Android的手机微博平台设计与开发
  17. (每日一练c++)统计某一单科成绩各分数段的分布人数
  18. Java实现 蓝桥杯 算法训练 相邻数对(暴力)
  19. c++ qt 操作Excel 实现冻结窗格的功能。
  20. poj 1637 Sightseeing tour 混合欧拉图判定

热门文章

  1. Gin实践 番外 Golang交叉编译
  2. Oracle 12c 安装及配置
  3. deprecated conversion from string constant to ‘char*’
  4. 如何用c#打开文件夹并选择文件夹内的一个文件 open folder and select file
  5. 陕西卫视《关中男人》观后感--女人之后是男人?
  6. LeetCode 164. 最大间距
  7. 记一次Kafka集群的故障恢复
  8. Golang之不可重入函数实现
  9. 孤岛惊魂5服务器稳定吗,这才是《孤岛惊魂5》真正的“最低画质”
  10. mysql修改字段null为空字符串