在没有认识到很复杂的问题应该更多的交给数据库来处理前,在做项目过程中曾遇到这样的问题,需要找到每天记录对应的最大值和最小值。选择起始时间和终止时间来获取该段日期范围内记录的最大最小值,需要显示在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字段合并而来。