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

本文介绍如何使用SQL从包含重复ID的数据表中选择具有最小值Val的记录。提供了四种不同的方法,包括使用内连接和子查询的方式,并进一步拓展了如何选择每个ID下首次出现的记录。

引言:

  为什么会引入这个问题,在程序中遇到这样的问题,在某个数据表中,相同的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 a.ID=b.ID and  a.Val=b.val

方法二:

1      select a.* from T1 a
2      inner join
3      (select id,min(Val) as val from T1 group by id) b
4      on a.id=b.id and a.Val=b.val

 说明:方法一与方法二的作用相同,并没有区别,只不过where是隐式链接,inner join是显式链接,where逐步被边缘化。

 方法三:

1      select a.* from T1 a
2      where a.val=(select min(Val) from T1 where ID=a.ID)

ID相同,取最小的Val值。

方法四:

1      select a.* from T1 as a where not exists (select * from T1 b where b.Val<a.Val and b.ID=a.ID)

 

拓展:还是按照字段分组,选择第一条出现的数据:

想实现的效果:

 

方法:

     select a.* from T1 as a where val=(select top 1 Val from T1 b where a.ID=b.ID)

 

转载于:https://www.cnblogs.com/SharpL/p/4628973.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值