请问SQL查询语句中如何让多列重复的记录只保留一条记录,其它的数据正常显示

godmouser 2008-03-04 01:50:37
表名:testb
字段:t1,t2,t3,t4,t5,t6
数据如下:
t1 t2 t3 t4 t5 t6
11 22 33 44 55 66
11 as 33 gr 55 66
22 22 33 44 58 84
12 54 33 44 55 48

查询的结果要是这样的
t1 t2 t3 t4 t5 t6
11 22 33 44 55 66
11 as 33 gr 55 66
22 22 33 44 58 84

去掉最后一行,比较t3,t4,t5,如果值都一样,则保留一项就可以了,其它的全部显示
请问该怎么写呢?
...全文
703 13 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
lllyyymmm 2008-03-04
  • 打赏
  • 举报
回复
如果只是要单存实现这样,可如下操作:
declare @testb table(t1 int,t2 varchar(10),t3 int,t4 varchar(10),t5 int,t6 int)
insert into @testb values(11,'22',33,'44',55,66)
insert into @testb values(11,'as',33,'gr',55,66)
insert into @testb values(22,'22',33,'44',58,84)
insert into @testb values(12,'54',33,'44',55,48)
select min(t1),min(t2),t3,t4,t5,min(t6) from @testb group by t3,t4,t5
dawugui 2008-03-04
  • 打赏
  • 举报
回复
表名:testb
字段:t1,t2,t3,t4,t5,t6
数据如下:
t1 t2 t3 t4 t5 t6
11 22 33 44 55 66
11 as 33 gr 55 66
22 22 33 44 58 84
12 54 33 44 55 48

查询的结果要是这样的
t1 t2 t3 t4 t5 t6
11 22 33 44 55 66
11 as 33 gr 55 66
22 22 33 44 58 84

去掉最后一行,比较t3,t4,t5,如果值都一样,则保留一项就可以了,其它的全部显示
请问该怎么写呢?
----------------------------
select t.* from tb t where t1 = (select min(t1) from tb where t3 = t.t3 and t4 = t.t4 and t5 = t.t5)
select t.* from tb t where t1 = (select max(t1) from tb where t3 = t.t3 and t4 = t.t4 and t5 = t.t5)

更多方法见下:
--按某一字段分组取最大(小)值所在行的数据
(爱新觉罗.毓华 2007-10-23于浙江杭州)
/*
数据如下:
name val memo
a 2 a2(a的第二个值)
a 1 a1--a的第一个值
a 3 a3:a的第三个值
b 1 b1--b的第一个值
b 3 b3:b的第三个值
b 2 b2b2b2b2
b 4 b4b4
b 5 b5b5b5b5b5
*/
--创建表并插入数据:
create table tb(name varchar(10),val int,memo varchar(20))
insert into tb values('a', 2, 'a2(a的第二个值)')
insert into tb values('a', 1, 'a1--a的第一个值')
insert into tb values('a', 3, 'a3:a的第三个值')
insert into tb values('b', 1, 'b1--b的第一个值')
insert into tb values('b', 3, 'b3:b的第三个值')
insert into tb values('b', 2, 'b2b2b2b2')
insert into tb values('b', 4, 'b4b4')
insert into tb values('b', 5, 'b5b5b5b5b5')
go

--一、按name分组取val最大的值所在行的数据。
--方法1:
select a.* from tb a where val = (select max(val) from tb where name = a.name) order by a.name
--方法2:
select a.* from tb a where not exists(select 1 from tb where name = a.name and val > a.val)
--方法3:
select a.* from tb a,(select name,max(val) val from tb group by name) b where a.name = b.name and a.val = b.val order by a.name
--方法4:
select a.* from tb a inner join (select name , max(val) val from tb group by name) b on a.name = b.name and a.val = b.val order by a.name
--方法5
select a.* from tb a where 1 > (select count(*) from tb where name = a.name and val > a.val ) order by a.name
/*
name val memo
---------- ----------- --------------------
a 3 a3:a的第三个值
b 5 b5b5b5b5b5
*/

--二、按name分组取val最小的值所在行的数据。
--方法1:
select a.* from tb a where val = (select min(val) from tb where name = a.name) order by a.name
--方法2:
select a.* from tb a where not exists(select 1 from tb where name = a.name and val < a.val)
--方法3:
select a.* from tb a,(select name,min(val) val from tb group by name) b where a.name = b.name and a.val = b.val order by a.name
--方法4:
select a.* from tb a inner join (select name , min(val) val from tb group by name) b on a.name = b.name and a.val = b.val order by a.name
--方法5
select a.* from tb a where 1 > (select count(*) from tb where name = a.name and val < a.val) order by a.name
/*
name val memo
---------- ----------- --------------------
a 1 a1--a的第一个值
b 1 b1--b的第一个值
*/

--三、按name分组取第一次出现的行所在的数据。
select a.* from tb a where val = (select top 1 val from tb where name = a.name) order by a.name
/*
name val memo
---------- ----------- --------------------
a 2 a2(a的第二个值)
b 1 b1--b的第一个值
*/

--四、按name分组随机取一条数据。
select a.* from tb a where val = (select top 1 val from tb where name = a.name order by newid()) order by a.name
/*
name val memo
---------- ----------- --------------------
a 1 a1--a的第一个值
b 5 b5b5b5b5b5
*/

--五、按name分组取最小的两个(N个)val
select a.* from tb a where 2 > (select count(*) from tb where name = a.name and val < a.val ) order by a.name,a.val
select a.* from tb a where val in (select top 2 val from tb where name=a.name order by val) order by a.name,a.val
select a.* from tb a where exists (select count(*) from tb where name = a.name and val < a.val having Count(*) < 2) order by a.name
/*
name val memo
---------- ----------- --------------------
a 1 a1--a的第一个值
a 2 a2(a的第二个值)
b 1 b1--b的第一个值
b 2 b2b2b2b2
*/

--六、按name分组取最大的两个(N个)val
select a.* from tb a where 2 > (select count(*) from tb where name = a.name and val > a.val ) order by a.name,a.val
select a.* from tb a where val in (select top 2 val from tb where name=a.name order by val desc) order by a.name,a.val
select a.* from tb a where exists (select count(*) from tb where name = a.name and val > a.val having Count(*) < 2) order by a.name
/*
name val memo
---------- ----------- --------------------
a 2 a2(a的第二个值)
a 3 a3:a的第三个值
b 4 b4b4
b 5 b5b5b5b5b5
*/
--七,如果整行数据有重复,所有的列都相同。
/*
数据如下:
name val memo
a 2 a2(a的第二个值)
a 1 a1--a的第一个值
a 1 a1--a的第一个值
a 3 a3:a的第三个值
a 3 a3:a的第三个值
b 1 b1--b的第一个值
b 3 b3:b的第三个值
b 2 b2b2b2b2
b 4 b4b4
b 5 b5b5b5b5b5
*/
--在sql server 2000中只能用一个临时表来解决,生成一个自增列,先对val取最大或最小,然后再通过自增列来取数据。
--创建表并插入数据:
create table tb(name varchar(10),val int,memo varchar(20))
insert into tb values('a', 2, 'a2(a的第二个值)')
insert into tb values('a', 1, 'a1--a的第一个值')
insert into tb values('a', 1, 'a1--a的第一个值')
insert into tb values('a', 3, 'a3:a的第三个值')
insert into tb values('a', 3, 'a3:a的第三个值')
insert into tb values('b', 1, 'b1--b的第一个值')
insert into tb values('b', 3, 'b3:b的第三个值')
insert into tb values('b', 2, 'b2b2b2b2')
insert into tb values('b', 4, 'b4b4')
insert into tb values('b', 5, 'b5b5b5b5b5')
go

select * , px = identity(int,1,1) into tmp from tb

select m.name,m.val,m.memo from
(
select t.* from tmp t where val = (select min(val) from tmp where name = t.name)
) m where px = (select min(px) from
(
select t.* from tmp t where val = (select min(val) from tmp where name = t.name)
) n where n.name = m.name)

drop table tb,tmp

/*
name val memo
---------- ----------- --------------------
a 1 a1--a的第一个值
b 1 b1--b的第一个值

(2 行受影响)
*/
--在sql server 2005中可以使用row_number函数,不需要使用临时表。
--创建表并插入数据:
create table tb(name varchar(10),val int,memo varchar(20))
insert into tb values('a', 2, 'a2(a的第二个值)')
insert into tb values('a', 1, 'a1--a的第一个值')
insert into tb values('a', 1, 'a1--a的第一个值')
insert into tb values('a', 3, 'a3:a的第三个值')
insert into tb values('a', 3, 'a3:a的第三个值')
insert into tb values('b', 1, 'b1--b的第一个值')
insert into tb values('b', 3, 'b3:b的第三个值')
insert into tb values('b', 2, 'b2b2b2b2')
insert into tb values('b', 4, 'b4b4')
insert into tb values('b', 5, 'b5b5b5b5b5')
go

select m.name,m.val,m.memo from
(
select * , px = row_number() over(order by name , val) from tb
) m where px = (select min(px) from
(
select * , px = row_number() over(order by name , val) from tb
) n where n.name = m.name)

drop table tb

/*
name val memo
---------- ----------- --------------------
a 1 a1--a的第一个值
b 1 b1--b的第一个值

(2 行受影响)
*/
godmouser 2008-03-04
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 flairsky 的回复:]
不过group by 会出现2个,与你要求貌似不符合

按你的意思是如果t4,t4,t5相同,其他无所谓取哪条?
[/Quote]

t3,t4,t5相同的只取一条,哪条都可以,但是其它的字段必需都显示出来,比如t1,t2,t6要显示
xiaoliaoyun 2008-03-04
  • 打赏
  • 举报
回复

declare @testb table(t1 int,t2 varchar(10),t3 int,t4 varchar(10),t5 int,t6 int)
insert into @testb values(11,'22',33,'44',55,66)
insert into @testb values(11,'as',33,'gr',55,66)
insert into @testb values(22,'22',33,'44',58,84)
insert into @testb values(12,'54',33,'44',55,48)

select * from @testb
select * from @testb a
where not exists(select 1 from @testb b where a.t3= b.t3 and a.t4 = b.t4 and a.t5 = b.t5 and a.t6<b.t6)
flairsky 2008-03-04
  • 打赏
  • 举报
回复
不过group by 会出现2个,与你要求貌似不符合

按你的意思是如果t4,t4,t5相同,其他无所谓取哪条?
flairsky 2008-03-04
  • 打赏
  • 举报
回复
……
你当然不能只select t3,t4,t5

比方你select t1 from ... group by t3,t4,t5
青锋-SS 2008-03-04
  • 打赏
  • 举报
回复
呵呵,偶闹反了.
chuifengde 2008-03-04
  • 打赏
  • 举报
回复
select * from [Table] a where not exists(select 1 from [Table] where t3=a.t3 and t4=a.t4 and t5=a.t5 and checksum(t1,t2)>checksum(a.t1,a.t2))
godmouser 2008-03-04
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 flairsky 的回复:]
select ... group by t3,t4,t5
[/Quote]这个我用过,这样只能显示t3,t4,t5三列,但是我还需要显示其它的列
godmouser 2008-03-04
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 sdhylj 的回复:]
有主键吗?
[/Quote]没有主键
青锋-SS 2008-03-04
  • 打赏
  • 举报
回复
select * from testb where not exists(select 1 from testb t where t.主键=testb.主键 and checksum(t.t3,t.t4,t.t5)<checksum(testb.t3,testb.t4,testb.t5))
flairsky 2008-03-04
  • 打赏
  • 举报
回复
select ... group by t3,t4,t5
青锋-SS 2008-03-04
  • 打赏
  • 举报
回复
有主键吗?
“1-考试报名系统1”项目是一个数据结构课程设计,旨在创建一个考试报名系统。该项目由汪明杰同学在软件学院软件工程专业,同济大学进行,指导教师为张颖。 本文档详细阐述了项目的分析、设计、实现和测试过程。首先,项目背景指出考试报名系统对学校教务管理的重要性,特别是在处理大量考试人员时的挑战。接着,项目需求分析部分明确了系统应具备的功能,包括用户友好性、数据处理能力等。 在项目要求,功能要求详细列出了系统应具备的各个功能,如: 1.3.1 功能要求:这可能包括考生注册、考试选择、报名、取消报名、查询考试信息等功能。 1.3.2 输入格式:可能涉及考生信息输入的格式规范,如姓名、学号、选择的考试科目等。 1.3.3 输出格式:可能涉及打印报名成功通知、查询结果展示等输出信息的格式。 项目设计部分讨论了数据结构和类的设计: 2.1 数据结构设计:可能使用数据结构如链表来存储和管理考生信息和考试数据。 2.2 类设计:包括结点类(ListNode)、双向链表类(List)以及数据库类(DataBase),用于构建系统的核心结构。 在项目实现章节,详细描述了各个功能的实现逻辑和代码,包括: 3.1 项目主体功能:涵盖系统的整体流程和代码实现。 3.2 项目初始化:如何加载初始数据,包括读取文件和手动输入。 3.3 插入数据:添加新的考生信息或考试报名。 3.4 删除数据:取消考生的报名。 3.5 修改数据:更新考生信息或考试选择。 3.6 查询数据:根据特定条件查找考生信息或考试详情。 3.7 统计数据:可能包括统计报名人数、考试科目选择情况等。 最后,项目测试部分涵盖了各种测试用例,确保系统的正确性和稳定性,如: 4.1 项目初始化测试:验证数据加载功能。 4.2 插入、删除、查找、修改和统计测试:分别检查各功能是否正常工作。 4.7 边界测试:测试特殊情况,如插入已存在的考生、删除不存在的考生等。 这个“1-考试报名系统1”项目涵盖了软件开发的完整生命周期,从需求分析到设计、实现和测试,体现了软件工程的核心原则,特别是数据结构的应用和系统功能的实现。
根据提供的文件信息,本知识点将围绕“postprocess_swan”笔记本集合及其相关的SWAN数值模型后处理过程展开。 标题的“postprocess_swan”指出这是一个专门用于后处理SWAN(Simulating Waves Nearshore)数值模型结果的笔记本集合。SWAN模型是一个广泛应用于近岸海域的波浪模拟工具,它可以模拟和分析波浪传播、生成、折射、反射、叠加以及破碎等现象。SWAN模型结果的后处理是整个模拟过程的重要环节,它能够帮助研究人员分析波浪的特征,预测波浪对海岸线和海洋工程结构的影响。后处理包括数据可视化、数据统计、结果验证和解释等多个方面。 描述提到的“后处理天鹅”,可能是对“postprocess_swan”的一种形象描述,但应该是指对SWAN模型输出结果的处理过程,而不是指某种生物或实体。 由于文件信息未提供具体的标签内容,我们无法从这个角度提供相关的知识点。然而,“postprocess_swan-master”文件名暗示了这可能是一个开源项目,通常以“-master”结尾的文件名称表示这是一个包含源代码、数据文件、说明文档等资源的仓库主分支。 现在,让我们探讨几个与“postprocess_swan”相关的具体知识点: 1. SWAN模型简介: - SWAN全称为“Simulating Waves Nearshore”,是一种用于计算近岸波浪的数值模型。 - 它基于波浪运动的物理原理,包括波浪能量平衡方程。 - SWAN模型可以模拟波浪的成长、衰减、折射、绕射、反射和底摩擦等物理过程。 - 该模型适用于海浪、风浪、以及与海浪相关的波浪动力学问题的研究。 2. SWAN模型的应用: - 风暴潮和极端天气事件下波浪高度和周期的模拟。 - 海岸线工程的波浪载荷分析,如防波堤、海堤和人工岛的波浪作用评估。 - 环境影响评估,比如石油平台、海上风电场以及港口的建设和运营对波浪场的影响。 - 海洋资源开发,例如海底油气管道铺设和维护过程的波浪条件预测。 3. SWAN模型后处理的重要性: - 通过后处理可以验证SWAN模型的准确性,确保模拟结果的可靠性。 - 后处理过程包括数据的提取、整理和分析,有助于更好地理解模型输出。 - 数据可视化是后处理不可或缺的一部分,可以直观地展现波浪场的分布特征。 - 结果解释和验证通常需要与现场观测数据或其他模型预测结果对比。 4. 后处理过程的常见操作: - 绘制波浪玫瑰图、等值线图和波高分布图等。 - 计算波浪的方向谱、频率谱和波浪能量分布。 - 使用统计分析工具,如计算波浪的平均周期、有效波高和波浪方向。 - 提取特定区域或时间点的波浪数据,进行局部细节分析。 5. SWAN模型后处理工具和方法: - 后处理工具可能包括SWAN自带的分析模块、Matlab、Python或R语言数据处理脚本。 - 对于可视化,可能会使用专业的数据可视化软件,如Surfer、QGIS、ArcGIS或者其他开源工具。 - 模型结果通常需要与测量数据(如ADCP数据、水位计数据)或其他模拟结果进行对比验证。 6. 开源项目“postprocess_swan”的特点和功能: - 可能提供了一套完整的后处理流程模板,便于研究人员直接使用。 - 包含了多种数据分析和可视化的方法,提高了工作效率。 - 作为一个开源项目,它可能具备良好的社区支持,方便用户提出问题和改进意见。 - 随着项目的发展,还可能包含用于处理SWAN模型不同版本输出结果的适应性调整功能。 通过以上知识点的阐述,我们可以看到“postprocess_swan”笔记本集合对于SWAN模型结果后处理的重要性和实用性。对于海洋工程、海岸工程以及海洋环境研究领域的科研人员来说,一个功能完善的后处理工具是他们进行数据分析和科学发现的关键支持。
【正文】 电脑主板型号修改软件v1.1是一款专门针对计算机主板信息进行调整的工具,主要功能在于修改主板的品牌、型号、序列号以及BIOS版本等信息。在IT行业,这种软件的应用通常与硬件测试、系统优化或者修复某些特定问题有关。然而,需要注意的是,非法篡改这些信息可能涉及法律问题,因此在使用时应遵循合法合规的原则。 主板是计算机的核心部件,负责连接各个硬件组件并提供数据交换的平台。主板的品牌和型号决定了其兼容性和性能,而序列号则是主板的身份标识,用于区分每块主板的独特性。BIOS(基本输入输出系统)则是主板上的一段固件,负责引导操作系统启动和管理硬件资源。 该软件允许用户自定义这些信息,有以下几个可能的用途: 1. **硬件测试**:在开发或测试新硬件时,制造商可能需要模拟不同类型的主板环境。通过修改主板信息,可以快速创建多种测试场景,以确保新硬件在各种配置下都能正常工作。 2. **系统优化**:某些应用程序或游戏可能会对特定主板型号有优化,修改主板信息可能有助于提升性能或解决兼容性问题。不过,这并不总是有效,也可能导致其他问题。 3. **故障排除**:在某些情况下,错误的主板信息可能导致驱动程序安装失败或系统运行异常。修改这些信息有时可以帮助诊断和解决问题。 4. **安全风险**:值得注意的是,非法修改主板信息也可能被用于欺骗目的,如逃避保修期限制或进行非法活动。因此,使用此类软件需谨慎,并且要清楚可能带来的法律风险。 在使用"电脑主板型号修改软件v1.1.exe"前,用户应确保具备一定的电脑硬件知识,理解操作可能带来的后果。同时,备份重要的数据是必要的,因为不正确的修改可能会导致系统不稳定甚至无法启动。在执行修改前,了解主板的原始信息,并在必要时咨询专业人士的建议,是非常重要的。 这款软件为特定的IT任务提供了便利,但也提醒我们在使用时要遵守法律,尊重知识产权,并充分了解潜在风险。谨慎操作,合理利用,才能充分发挥这类工具的效用,同时避免不必要的麻烦。

34,871

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧