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

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

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

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

查SQL Server数据最大表 sql server查询最大值最小值_查SQL Server数据最大表


现在我要取出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,'')

查SQL Server数据最大表 sql server查询最大值最小值_sql server_02


对于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,'')))

执行结果:

查SQL Server数据最大表 sql server查询最大值最小值_数据库_03


然后使用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)

执行结果:

查SQL Server数据最大表 sql server查询最大值最小值_最大最小值_04


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

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

查SQL Server数据最大表 sql server查询最大值最小值_最大最小值_05


执行结果:

查SQL Server数据最大表 sql server查询最大值最小值_查SQL Server数据最大表_06