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
    

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

    sql server中查询最大最小值的时候很简单,直接取max(val)、min(val),然后group by 某需要统计的字段就可以统计出来,但是,在实际项目中,很多取最大最小值的操作都需要取出出现最大最小值对应的某列的值。 实现这种需求,如果直接在select中加入该字段,则会报出"group by 不包含该字段"的错误信息,所以每次在遇到这种取最大最小值对应的某个要素的情况时,都是单独统计出最大最小值,然后再在循环体中查询最大最小值对应的要素值,事实证明,这种解决方案真的是很 一、SQL查询一个表中类别字段最大对应(对一张表的操作): 问题:根据教师id查询checkOutAutoID最大的一条记录里的上期余额? 1.group by方法: 首先查询表中相同teacherID对应的checkOutAutoID的最大: select MAX(checkOutAutoID) fro select max(value) from T ; # 查询的只是结构内的最大(小),但未将记录查询出来。 有人可能第一反应是分组嘛,group by id 。查询出id或者name。但是就掉坑里了。 group by的意思是 根据(by)一定的规则进行分组(Group)”。它的作用是通过一定的规...
    两个表A,BA有ID,NAME等字段B有ID,AID,PRICE等字段注:A.ID关联B.AID 我想按A分类查询B产品的最低价? 假如有数据:A表------------ID NAME1 DEMO2 DEMO2------------------------ B表-------------ID AID PRICE1 1 302 1 323 1 26-------------如何查询到以下结...
    1、SQL基本语句2、汇总函数count函数:求某的函数sum函数:对某数据求和avg函数:求某数据的平均max函数:求某数据最大min函数:求某数据最小值函数的功能:数据输入、自身的特性功能、数据输出练习1:查询课程编号为0002的总成绩select 课程号, sum(成绩) as '总成绩' from score where 课程号='0002';显示结果:练习2:查询选了课...
    SQL server 查询 最大数据----对应的----数据时间 SQL server 查询 最小数据----对应的----数据时间 先看SQL执行完成的效果图 1. 1.建表 IF EXISTS (SELECT * FROM sys.all_objects WHERE object_id = OBJECT_ID(N'[dbo].[testA]') AND type IN ('U')) DROP TABLE [dbo].[testA] CREATE TABLE [dbo].[testA]
    select (case when c.a>c.b then c.a else c.b end) as MaxTime from (SELECT MAX(字段1) as a ,MAX(字段2) as b FROM [表] ) as c 执行完成之后得到最大 转载于:https://www.cnblogs.com/cfss... ( SELECT businessid, min( indexs ) AS maxindexs FROM process GROUP BY businessid ) a LEFT JOIN process b ON a.maxindexs = b.indexs AND a.businessid = b.businessid
    SQL Server 按某一字段分组 取 最大 (小)所在行的数据 -- 按某一字段分组 取 最大 (小)所在行的数据 -- (爱新觉罗.毓华(十八年风雨,守得冰山雪莲花开) 2007-10-23于浙江杭州) 数据如下: name val memo a 2 a2(a的第二个) a 1 a1--a的第一个 a 3 a3...