zoukankan      html  css  js  c++  java
  • 最大最小值问题

           在没有认识到很复杂的问题应该更多的交给数据库来处理前,在做项目过程中曾遇到这样的问题,需要找到每天记录对应的最大值和最小值。选择起始时间和终止时间来获取该段日期范围内记录的最大最小值,需要显示在DataGrid中按下面这样显示:
                   名称     最大值     最大值发生时间     最小值      最小值发生时间

    这个看似简单的问题对我来说,却遇到很多的麻烦,其一是名称:不仅仅是从某张表中某个字段取出的值,而是一个相加合并得到的名称。其二是最大值,这个对我来说不是问题,max(字段)就能得到对应记录的最大值。其三是最大值发生时间,和名称一样也是一个合并显示值,但是有区别与名称的是从同一张表的不同字段中取得。其四是最小值,不可能用一条简单的sql语句就能解决同时取得一条记录最大值和最小值。这才是我最苦恼的问题。按我以前所用的方法:先找到对应名称的最大值和最大值发生时间,然后由PosID(主建)和最大值来循环搜索对应的最小值和最小值发生时间。每天记录都需要做一个循环,这样势必要降低系统性能。"知道人类和计算机的区别是什么吗?人类更适合做逻辑方面的问题,计算机更适合做计算方面的问题。为什么不把复杂的计算交给计算机,而我们只提供算法"我的主管提示我,经过他这句话的点补,我一下子有了解决问题的方法。上面的问题我是通过下面的sql语句来解决的。
    select concat(concat(e.AreaName,'/'),d.PosName) as 名称,b.UA_Max as 最大值,concat(concat(char(b.ANALYSE_DATE),' '),char(b.UA_MAX_TIME)) as 最大值发生时间,c.UA_Min as 最小值,concat(concat(char(c.ANALYSE_DATE),' '),char(UA_Min_Time)) as 最小值发生时间 from
     (select posid,Max(UA_Max) as maxf,Min(UA_Min) as minf  from CA_ANALYSE_DAY_MAXMIN where ANALYSE_DATE>='2005-08-1' and ANALYSE_DATE<='2005-08-10' and posid in (1,2,3,4,5,6,7,8) group by posid) a Left Join
    (Select posid,UA_Max,ANALYSE_DATE,UA_MAX_TIME from CA_ANALYSE_DAY_MAXMIN where ANALYSE_DATE>='2005-08-1' and ANALYSE_DATE<='2005-08-10'  ) b on a.posid=b.posid and a.maxf=b.UA_Max Left Join 
    (Select posid,UA_Min,ANALYSE_DATE,UA_Min_Time  from CA_ANALYSE_DAY_MAXMIN where ANALYSE_DATE>='2005-08-1' and ANALYSE_DATE<='2005-08-10' ) c on a.posid=c.posid and a.minf=c.UA_Min Left  Join (Select *  from CA_pos  where posType<>12 and PosType<>6 ) d on d.posid=b.posid Left Join (select *  from CA_Area where AreaType=3) e on d.stationid=e.areaid

    整个sql语句是靠主建PosID来贯串的,其中concat(concat(e.AreaName,'/'),d.PosName) as 名称,b.UA_Max as 最大值,concat(concat(char(b.ANALYSE_DATE),' '),char(b.UA_MAX_TIME)) as 最大值发生时间,c.UA_Min as 最小值,concat(concat(char(c.ANALYSE_DATE),' '),char(UA_Min_Time)) as 最小值发生时间,是将要显示的信息以什么样的方式进行显示。其中函数concat(str1,str2)是将二个字符串的值进行合并,char是将非字符串类型转换成字符串类型。

    (select posid,Max(UA_Max) as maxf,Min(UA_Min) as minf  from CA_ANALYSE_DAY_MAXMIN where ANALYSE_DATE>='2005-08-1' and ANALYSE_DATE<='2005-08-10' and posid in (1,2,3,4,5,6,7,8) group by posid) a 是将表中对应posid进行分类,并搜索出这段日期范围的最大值和最小值。

    Left Join (Select posid,UA_Max,ANALYSE_DATE,UA_MAX_TIME from CA_ANALYSE_DAY_MAXMIN where ANALYSE_DATE>='2005-08-1' and ANALYSE_DATE<='2005-08-10'  ) b on a.posid=b.posid and a.maxf=b.UA_Max ,由主建PosID和搜索到最大值来搜索出这段日期范围的最大值和最大值发生日期和最大值发生时间点。DataGrid中显示最大值发生时间就是最大值发生日期和最大值发生时间点。

    Left Join  (Select posid,UA_Min,ANALYSE_DATE,UA_Min_Time  from CA_ANALYSE_DAY_MAXMIN where ANALYSE_DATE>='2005-08-1' and ANALYSE_DATE<='2005-08-10' ) c on a.posid=c.posid and a.minf=c.UA_Min ,由主建PosID和搜索到最小值来搜索出这段日期范围的最小值和最小值发生日期和最大值发生的时间点。DataGrid中显示最大值发生时间就是最小值发生日期和最小值发生时间点。

    Left  Join (Select *  from CA_pos  where posType<>12 and PosType<>6 ) d on d.posid=b.posid Left Join (select *  from CA_Area where AreaType=3) e on d.stationid=e.areaid。DataGrid中显示的名称就是从CA_pos表的PosName字段和CA_Area表AreaName字段合并而来。

  • 相关阅读:
    Sql Server 2008卸载后再次安装一直报错
    listbox 报错 Cannot have multiple items selected when the SelectionMode is Single.
    Sql Server 2008修改Sa密码
    学习正则表达式
    Sql Server 查询第30条数据到第40条记录数
    Sql Server 复制表
    Sql 常见面试题
    Sql Server 简单查询 异步服务器更新语句
    jQuery stop()用法以及案例展示
    CSS3打造不断旋转的CD封面
  • 原文地址:https://www.cnblogs.com/yuyu/p/218621.html
Copyright © 2011-2022 走看看