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

本文涉及的产品
云数据库 RDS SQL Server,基础系列 2核4GB
简介: 原文:SQL Server 2008 R2——ROW_NUMBER() 去掉不同行中相同列的重复内容==================================声明================================== 本文原创,转载在正文中显要的注明作者和出处,并保证文章的完整性。
原文: 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

则效果为

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

但是怎么才能把变成呢?

 

 
目录
相关文章
|
关系型数据库 MySQL 网络安全
5-10Can't connect to MySQL server on 'sh-cynosl-grp-fcs50xoa.sql.tencentcdb.com' (110)")
5-10Can't connect to MySQL server on 'sh-cynosl-grp-fcs50xoa.sql.tencentcdb.com' (110)")
|
12月前
|
SQL 存储 数据采集
sql中varchar转number时报错怎么解决
通过上述策略的综合运用,面对VARCHAR到NUMBER的转换挑战,不仅能够游刃有余地解决现有的问题,更能前瞻性地预防未来的隐患。在数字化转型的浪潮中,凭借其高性能、安全稳定的云产品与服务,为各类企业级应用保驾护航,助您轻松驾驭数据的海洋,实现业务的无缝扩展与全球布局。
429 0
|
SQL 存储 监控
SQL Server的并行实施如何优化?
【7月更文挑战第23天】SQL Server的并行实施如何优化?
478 13
解锁 SQL Server 2022的时间序列数据功能
【7月更文挑战第14天】要解锁SQL Server 2022的时间序列数据功能,可使用`generate_series`函数生成整数序列,例如:`SELECT value FROM generate_series(1, 10)。此外,`date_bucket`函数能按指定间隔(如周)对日期时间值分组,这些工具结合窗口函数和其他时间日期函数,能高效处理和分析时间序列数据。更多信息请参考官方文档和技术资料。
292 9
|
SQL 存储 网络安全
关系数据库SQLserver 安装 SQL Server
【7月更文挑战第26天】
198 6
|
SQL Oracle 关系型数据库
MySQL、SQL Server和Oracle数据库安装部署教程
数据库的安装部署教程因不同的数据库管理系统(DBMS)而异,以下将以MySQL、SQL Server和Oracle为例,分别概述其安装部署的基本步骤。请注意,由于软件版本和操作系统的不同,具体步骤可能会有所变化。
1091 3
|
存储 SQL C++
对比 SQL Server中的VARCHAR(max) 与VARCHAR(n) 数据类型
【7月更文挑战7天】SQL Server 中的 VARCHAR(max) vs VARCHAR(n): - VARCHAR(n) 存储最多 n 个字符(1-8000),适合短文本。 - VARCHAR(max) 可存储约 21 亿个字符,适合大量文本。 - VARCHAR(n) 在处理小数据时性能更好,空间固定。 - VARCHAR(max) 对于大文本更合适,但可能影响性能。 - 选择取决于数据长度预期和业务需求。
1079 1
|
SQL 安全 Java
驱动程序无法通过使用安全套接字层(SSL)加密与 SQL Server 建立安全连接。错误:“The server selected protocol version TLS10 is not accepted by client
驱动程序无法通过使用安全套接字层(SSL)加密与 SQL Server 建立安全连接。错误:“The server selected protocol version TLS10 is not accepted by client
1163 0
|
分布式计算 BI MaxCompute
SQL 能力问题之输出聚合的维度列的名称,如何解决
SQL 能力问题之输出聚合的维度列的名称,如何解决
|
SQL 监控 数据库
SQL Server 查询超时问题排查
【7月更文挑战第8天】排查 SQL Server 查询超时涉及五个主要方面:检查复杂查询、评估服务器性能、审视配置参数、更新统计信息和分析执行计划。关注点包括查询的结构(如连接、子查询和索引),服务器资源(CPU、内存、网络延迟),连接和内存设置,以及统计信息的时效性。通过这些步骤可定位并解决性能瓶颈。
481 0

热门文章

最新文章