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

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

  • 5
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值