SQL按字段分组取最大(小)值记录(重复记录)

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

*/

SQL按字段分组取最大(小)值记录(重复记录),布布扣,bubuko.com

时间: 2024-12-06 09:34:29

SQL按字段分组取最大(小)值记录(重复记录)的相关文章

按某一字段分组取最大(小)值所在行的数据 分拆列值(转) 日期的推算

数据如下:name val memoa 2 a2(a的第二个值)a 1 a1--a的第一个值a 3 a3:a的第三个值b 1 b1--b的第一个值b 3 b3:b的第三个值b 2 b2b2b2b2b 4 b4b4b 5 b5b5b5b5b5*/--创建表并插入数据:create table tb(name varchar(10),val int,memo varchar(20))insert into tb values('a', 2, 'a2(a的第二个值)')insert into tb v

Sql按照字段分组,选取其他字段最值所在的行记录

引言: 为什么会引入这个问题,在程序中遇到这样的问题,在某个数据表中,相同的AID(项目ID)被多次添加到数据表中,所以对应于不同的时间,只想选取添加时间最早的哪一条记录. 参考:红黑联盟 所用到的数据表: 想实现的效果: 解释:相同的ID,由不同的人(Name)添加,我们选取值最小(Val)的那一行记录. 方法如下: 方法一: 1 select a.* from T1 a , 2 (select id,min(val) as val from T1 group by id) b 3 where

mysql根据某个字段分组根据更新时间获取最新的记录

我现在有一种统计表,要根据一个字段分组然后根据更新时间,每个分组获取最新的一条记录.命名感觉挺简单的一个需求,然而没什么思路,当然是问度娘了. 度娘的答案很统一,然而都不管用,都是报错的,不知道是不是因为mysql5.7的原因,不过我记得group by也是不能查出整条记录的,为什么百度上都可以,百思不得解! 从网上找个例子: 根据USER_ID分组,每个获取 last_updated_date最新的一条记录. SELECT ID,USER_ID,problems,last_updated_da

SQL触发器中若取到null值可能引发的问题

declare @code varchar(20), @cs varchar(20),@zc varchar(20)set @cs='('[email protected]+'*'[email protected]+')'print '字符'[email protected]insert into TESTER2 values(@cs,@zc,@cs) declare @code varchar(20), @cs varchar(20),@zc varchar(20)set @cs='1'set

MySql按字段分组取最大值记录

要求:获得按table1_id分组,并且age最大的记录信息,即2.3.5条 方法一: select * from (select * from table2 order by age desc) as a group by a.table1_id 方法二: select a.* from table2 as a where age = (select max(age) from table2 where a.table1_id=table1_id) 方法三: select a.* from t

MySql按字段分组取最大值记录 [此博文包含图片]

要求:获得按table1_id分组,并且age最大的记录信息,即2.3.5条 方法一: select * from (select * from table2 order by age desc) as a group by a.table1_id 方法二: select a.* from table2 as a where age = (select max(age) from table2 where a.table1_id=table1_id) 方法三: select a.* from t

SQL分组取每组前一(或几)条记录(排名)

mysql分组取每组前几条记录(排名) 附group by与order by的研究 http://www.jb51.net/article/31590.htm --按某一字段分组取最大(小)值所在行的数据 代码如下: /* 数据如下: 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 */ --创建表

在SQL Server中快速删除重复记录

在SQL Server中快速删除重复记录 2006-07-17 21:53:15 分类: SQL Server 开发人员的噩梦——删除重复记录 想必每一位开发人员都有过类似的经历,在对数据库进行查询或统计的时候不时地会碰到由于表中存在重复的记录而导致查询和统计结果不准确.解决该问题的办法就是将这些重复的记录删除,只保留其中的一条. 在SQL Server中除了对拥有十几条记录的表进行人工删除外,实现删除重复记录一般都是写一段代码,用游标的方法一行一行检查,删除重复的记录.因为这种方法需要对整个表

Oracle 查询并删除重复记录的SQL语句

查询及删除重复记录的SQL语句 1.查找表中多余的重复记录,重复记录是根据单个字段(peopleId)来判断select * from peoplewhere peopleId in (select   peopleId from   people group by   peopleId having count(peopleId) > 1) 2.删除表中多余的重复记录,重复记录是根据单个字段(peopleId)来判断,只留有rowid最小的记录delete from people where