sql server查询最大最小值对应的另一个字段值

sql server中查询最大最小值的时候很简单,直接取max(val)、min(val),然后group by 某需要统计的字段就可以统计出来,但是,在实际项目中,很多取最大最小值的操作都需要取出出现最大最小值对应的某列的值。

实现这种需求,如果直接在select中加入该字段,则会报出"group by 不包含该字段"的错误信息,所以每次在遇到这种取最大最小值对应的某个要素的情况时,都是单独统计出最大最小值,然后再在循环体中查询最大最小值对应的要素值,事实证明,这种解决方案真的是很浪费时间,直接影响项目的性能。

下面介绍一种直接sql语句取出最大最小值对应的某要素的方法:

此处,我简单设计了一个数据库表。 数据库表结构和数据如下:

现在我要取出ValTime(日期)在 2019-03-20 00:00:00 与2019-03-22 00:00:00之间,每天Value的最大值及最大值对应的Name(名称)

  1. 首先,取出最大值对应的Name值 select top 1 stuff((select ,+Name from mytable a where ValTime=2019-03-20 00:00:00.000 order by Value desc for xml path()),1,1,)

对于stuff和for xml的语法就不做过多解释了,主要解释一下这条语句实现的功能吧! 这里是把Name按照要取最大值的Value进行了倒序排序,执行结果如上图 2. 上一步可以取出某个时刻最大值对应的Name,也就是字符串中的第一个名称,那么下面从字符串中把第一个人名取出来 此处使用charindex(’,’,str),找出字符串str中‘,’第一次出现的位置,具体写法:

CHARINDEX(,,(select top 1 stuff((select ,+Name from mytable a where ValTime=2019-03-20 00:00:00.000 order by Value desc for xml path()),1,1,))) 
        
select CHARINDEX(,,(select top 1 stuff((select ,+Name from mytable a where ValTime=2019-03-20 00:00:00.000 order by Value desc for xml path()),1,1,)))

执行结果: 然后使用SUBSTRING(str,1,CHARINDEX(’,’,str)-1)取出第一个人名,具体写法:

select SUBSTRING((select top 1 stuff((select ,+Name from mytable a where ValTime=2019-03-20 00:00:00.000 order by Value desc for xml path()),1,1,)),1,CHARINDEX(,,(select top 1 stuff((select ,+Name from mytable a where ValTime=2019-03-20 00:00:00.000 order by Value desc for xml path()),1,1,)))-1)

执行结果: 3.完整sql语句

select SUBSTRING((select top 1 stuff((select ,+Name from mytable a where a.ValTime=b.ValTime order by Value desc for xml path()),1,1,)),1,CHARINDEX(,,(select top 1 stuff((select ,+Name from mytable a where a.ValTime=b.ValTime order by Value desc for xml path()),1,1,)))-1) 
,MAX(Value),ValTime
from mytable b
where ValTime between 2019-03-20 00:00:00 and 2019-03-22 00:00:00
group by ValTime

此处注意:之前的语句只是为了示例才写了具体时间,完整查询语句需要进行如下修改才能正确查询! 执行结果:

经验分享 程序员 微信小程序 职场和发展