`
cynan168
  • 浏览: 39273 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

SQL去除

阅读更多
我的原始问题

Name Path Time
1    c:   20:00
1    f:   20:00
1    d:   21:00
2    f:   20:00

要求返回
1    c:  
2    f:  

1    f:  
2    f:  
不能返回
1    c:  
1    f:  
2    f:  


这里面没有主键,要求返回前两列select Name,Path ,要求相同的Name的元组集合中取Time最小的,剩余的不能取出

经过搜索, 找到以下newb code,特以珍藏
SQL code
<!-- Code highlighting produced by Actipro CodeHighlighter (freeware) http://www.CodeHighlighter.com/ -->-- 假如DB2中转换varchar型数据为int行数据为cast,同SQL server一样. select t. * from testsql t where cast (hours as int ) = ( select max ( cast (hours as int )) from testsql where name = t.name) order by name -- 类似SQL server的诸多写法见下: -- 按某一字段分组取最大(小)值所在行的数据 (爱新觉罗.毓华 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 行受影响) */


引http://znsw.blog.hexun.com/22802673_d.html
分享到:
评论

相关推荐

    SQl去掉HTML标签函数

    SQl去掉HTML标签函数 彻底防止SQL注入

    SQL 去除字段中符号,只保留数字和字母

    --去除字段中符号,只保留数字和字母sql-- create FUNCTION DBO.REMOVE_SYMBLE(@S VARCHAR(100)) RETURNS VARCHAR(100) AS BEGIN DECLARE @SQL VARCHAR(100) SET @SQL=''

    sql去掉重复的数据 完全相同的数据去掉重复 及优化

    本文详细介绍了如何使用SQL去除表中的重复数据,并提供了一些性能优化的建议。通过这些方法和技术的应用,可以有效地提高数据质量和数据库系统的整体性能。希望这些知识能够帮助你在实际工作中更加高效地处理数据...

    sql去掉最后一个字符

    sql去掉最后一个字符,sql去掉最后一个字符

    去除plsql复制的sql语句的多余空格和换行符

    在plsql把一个sql语句美化后要复制到程序里使用时,就会发现有多余的空格和换行符,此程序将美化后的sql语句还原成1行sql语句

    SQLServer多种去除尾数多余的0

    本文将详细讲解如何解决SQL Server中去除浮点数或定点数尾部多余的零的问题。 首先,我们需要理解SQL Server中数值类型的存储机制。浮点数(float)是一种近似值数据类型,它使用二进制浮点表示法,这意味着它在...

    SQl去掉HTML標籤.txt

    SQl去掉HTML標籤.txt use master go sp_configure 'show advanced options', 1 GO RECONFIGURE; GO sp_configure 'Ole Automation Procedures', 1 GO RECONFIGURE; GO

    去掉相同字符的SQL函数.

    在SQL中,有时候我们需要处理字符串,去除重复的字符,以达到特定的数据处理目的。这个问题可以通过创建自定义函数来解决,正如题目和描述中所示。在给出的示例中,我们看到一个名为`CompareString`的SQL函数,它...

    powerdesigner中去掉生成sql中的引号

    本文将深入探讨如何在PowerDesigner中去除生成SQL中的引号,以提高SQL脚本的兼容性和执行效率。 ### PowerDesigner简介 PowerDesigner是Sybase(现为SAP)公司推出的一款集成化数据建模工具,它提供了全面的数据...

    sql去除重复记录大全

    各种去除重复的sql语句,日常常用,适合一些刚开始学习的基础人员

    sql小数点取值转换整理

    SQL中的取整函数 --遇到小数位就加1,非四舍五入 select CEILING(3.1) 结果为:4 --保留两位小数 1. 使用 Round() 函数,如 Round(@num,2) ,其中参数 2 表示 保留两位有效数字。 缺点:Round() 只是负责四舍五入到...

    sql_去除字符中空格

    ### SQL去除字符串中的空格 在SQL中,经常会遇到需要清理数据的情况,特别是处理文本字段时,去除字符串两端或中间的空格是非常常见的需求。本文将详细介绍如何使用SQL中的`LTRIM()`, `RTRIM()` 和 `TRIM()` 函数来...

    sql+如何去重复数据

    当我们面对数据表中存在多条相同记录的问题时,需要采取策略来去除这些重复项,确保数据的唯一性和准确性。以下是一些关于如何在SQL中去重的关键知识点: 1. **DISTINCT关键字**:最简单的方法是使用`SELECT ...

    eclipse开发java使用mybatis打印不带问号的可执行sql

    本人开发人员,平常也是在CSDN下载资料,现在不需要积分的少了,所以我也得赚点积分,绝对提高你的开发效率。eclipse开发java使用mybatis打印不带问号的可执行sql

    sqlServer实现去除字符串空格

    在SQL Server中,处理字符串时,经常会遇到需要去除字符串中空格的情况。这可能是为了确保数据的准确性,或者为了满足特定的格式要求。本篇文章将详细介绍如何在SQL Server中使用不同的函数来去除字符串中的空格。 ...

    sql+如何去重复数据,数据库去重复数据

    ### SQL去除重复数据的方法 #### 1. 使用`DISTINCT`关键字 `DISTINCT`是最常见的用于去除重复记录的关键字。它可以用来返回唯一不同的值。 **语法示例:** ```sql SELECT DISTINCT column_name FROM table_name; `...

    SQL语句去掉重复记录,获取重复记录

    SQL语句去掉重复记录,获取重复记录 SQL语句去掉重复记录、获取重复记录是数据库管理系统中非常重要的一个操作。下面,我们将详细介绍如何使用SQL语句来实现这两个操作。 去掉重复记录 在数据库中,重复记录是指...

    Sql Server 如何去掉内容里面的Html标签

    本文将详细介绍如何使用T-SQL(SQL Server的Transact-SQL扩展)来去除字符串中的HTML标签。 首先,我们来看一下提供的代码片段。这个示例创建了一个名为`dbo.removehtml`的用户定义函数,用于从输入的字符串中删除...

    SQL 清除文本中的换行符、回车符、制表符

    SQL 清除文本中的换行符、回车符、制表符

    关于sqlserver2008中xml关键字的小感悟

    在SQL Server 2008中,XML是一个重要的数据类型,它允许数据库存储和处理XML格式的数据。XML(eXtensible Markup Language)是一种标记语言,用于描述数据结构,其特点是自描述性和灵活性,使得数据能在不同的系统...

Global site tag (gtag.js) - Google Analytics