上次发过一个按当天分组取值的,今天发个隔天取值。
表名t_201012,结构如下,
id group1 obj date_time obj_value
1  一楼 房间1 2010-12-01 00:00:00 10  
2  一楼 房间2 2010-12-01 00:00:00 15
3  一楼 房间3 2010-12-01 00:00:00 15
4  二楼 房间1 2010-12-01 00:00:00 20
5  二楼 房间2 2010-12-01 00:00:00 10
6  一楼 房间1 2010-12-01 23:00:00 20  
7  一楼 房间2 2010-12-01 23:00:00 25
8  一楼 房间3 2010-12-01 23:00:00 20
9  二楼 房间1 2010-12-01 23:00:00 30
10 二楼 房间2 2010-12-02 23:00:00 30
11 一楼 房间1 2010-12-02 00:00:00 20  
12 一楼 房间2 2010-12-02 00:00:00 25
13 一楼 房间3 2010-12-02 00:00:00 25
14 二楼 房间1 2010-12-02 00:00:00 30
15 二楼 房间2 2010-12-02 00:00:00 20
16 一楼 房间1 2010-12-02 23:00:00 30  
17 一楼 房间2 2010-12-02 23:00:00 35
18 一楼 房间3 2010-12-02 23:00:00 30
19 二楼 房间1 2010-12-02 23:00:00 40
20 二楼 房间2 2010-12-02 23:00:00 40想分别按"group1"和date_time(yyyy-MM-dd)分组后,取该天最大时间分组下,所有obj_value之和,与上一天最大时间分组下,所有obj_value之和,最后取两者之差。例如,在上表中,2010-12-02的最大时间分组是2010-12-02 23:00:00,2010-12-01的最大时间分组是2010-12-01 23:00:00,按group1分组后,一楼2010-12-02最大时间分组之和为(30+35+30=95),一楼2010-12-01最大时间分组之和为(20+25+20=65),两者之差为(95-65=30).
实现后的样子如下:   
gourp1 date_time  cha_value
一楼   2010-12-01 null
二楼   2010-12-01 null
一楼   2010-12-02 30
二楼   2010-12-02 20另,数据按月分表,2010-12-01 要取t_201011表中11月30号的数据,即跨表计算。当找不到上一天的数据时,cha_value设为Null。

解决方案 »

  1.   

    gourp1 date_time  cha_value
    一楼   2010-12-01 null
    二楼   2010-12-01 null
    一楼   2010-12-02 30
    二楼   2010-12-02 20这个二楼   2010-12-02 20是怎么算出来的?!
      

  2.   

    按照你的说法,我是算不出你那个 “二楼   2010-12-02 20”
    建议楼主要提供例子的时候自己先验证一下,否则是浪费所有人的时间。select t1.group1,t1.cdate AS date_time,(t1.ovalue-t2.ovalue) AS cha_value
    from (
    Select group1,date(date_time) as cdate,sum(obj_value) as ovalue
    from t_201012 a
    where not Exists (select 1 from t_201012 where group1=a.group1 And date(date_time)=date(a.date_time) and date_time>a.date_time)
    group by group1,date(date_time)
    ) t1 left join (
    select group1,DATE(date_time) as cdate,sum(obj_value) as ovalue
    from t_201012 a
    where Not exists (select 1 from t_201012 where group1=a.group1 And date(date_time)=date(a.date_time) and date_time>a.date_time)
    group by group1,date(date_time)
    ) t2 on (t1.group1=t2.group1 and t1.cdate=t2.cdate+interval 1 day)
    order by 2 
      

  3.   

    第2个应该为80吧
    SELECT A.GROUP1,A.NEWD,A.NEWO-B.NEWO  FROM (
    SELECT a.group1,DATE(a.date_time) AS NEWD,SUM(a.obj_value) AS NEWO FROM ttr a 
    INNER JOIN 
    (SELECT group1,DATE(date_time),MAX(date_time) AS ma FROM ttr GROUP BY group1,DATE(date_time)) b
    ON a.group1=b.group1 AND a.date_time=b.ma GROUP BY a.group1,DATE(a.date_time)) a
    LEFT JOIN 
    (
    SELECT a.group1,DATE(a.date_time) AS NEWD,SUM(a.obj_value) AS NEWO FROM ttr a 
    INNER JOIN 
    (SELECT group1,DATE(date_time),MAX(date_time) AS ma FROM ttr GROUP BY group1,DATE(date_time)) b
    ON a.group1=b.group1 AND a.date_time=b.ma GROUP BY a.group1,DATE(a.date_time)) b
    ON DATE_ADD(A.NEWD,INTERVAL -1 DAY)=B.NEWD AND A.GROUP1=B.GROUP1 ORDER BY A.NEWD,A.GROUP1
      

  4.   

    可能我没说明白,我的意思是按照group1分组,取每天最大时间之和减去上一天最大时间之和。
    在示例中,2010-12-01 和2010-12-02的最大时间都是23:00:00 ,因此,
    一楼2010-12-01 最大时间之和为(20+25+20=65,即id=6、7、8所在行之和)
    二楼2010-12-01 最大时间之和为(30+30=60,即id=9、10所在行之和)
    一楼2010-12-02 最大时间之和为(30+35+30=95,即id=16、17、18所在行之和)
    二楼2010-12-02 最大时间之和为(40+40=80,即id=19、20所在行之和)
    在此基础上,用每天最大时间之和减去上一天最大时间之和得到最终结果(如果没有上一天的值,就赋空值,因没有2010-11-30的数据,因此2010-12-01的cha_value为null),所以最终结果为:
    gourp1 date_time  cha_value
    一楼    2010-12-01 null
    二楼    2010-12-01 null
    一楼    2010-12-02 30
    二楼    2010-12-02 20
    另外,如果2010-11-30有数据,就要考虑跨月计算。
      

  5.   

    楼主你即没有认真看你自己提供的数据,也没去试试别人给你的语句。二楼   2010-12-02 20
    二楼2010-12-01 最大时间之和为(30+30=60,即id=9、10所在行之和)仔细看一下你的 id=9、10所在行 的日期
     
      

  6.   

    GROUP1 NEWD A.NEWO-B.NEWO
    一楼 2010-12-01 null
    二楼 2010-12-01 null
    一楼 2010-12-02 30
    二楼 2010-12-02 20
    4楼代码结果