按条件分组后,取相邻两天数据之差。

kyle315 2010-12-19 11:41:12
上次发过一个按当天分组取值的,今天发个隔天取值。
表名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。



...全文
171 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
wwwwb 2010-12-22
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 kyle315 的回复:]
多谢楼上各位,确实是我的笔误,把
10 二楼 房间2 2010-12-02 23:00:00 30
中的日期写错了,应该是
10 二楼 房间2 2010-12-01 23:00:00 30
,多谢各位批评指正。
[/Quote]
GROUP1 NEWD A.NEWO-B.NEWO
一楼 2010-12-01 null
二楼 2010-12-01 null
一楼 2010-12-02 30
二楼 2010-12-02 20
4楼代码结果
kyle315 2010-12-21
  • 打赏
  • 举报
回复
多谢楼上各位,确实是我的笔误,把
10 二楼 房间2 2010-12-02 23:00:00 30
中的日期写错了,应该是
10 二楼 房间2 2010-12-01 23:00:00 30
,多谢各位批评指正。
WWWWA 2010-12-21
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 kyle315 的回复:]
可能我没说明白,我的意思是按照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-1……
[/Quote]
二楼2010-12-01 最大时间之和为 30
9 二楼 房间1 2010-12-01 23:00:00 30
二楼2010-12-02 最大时间之和为 110(
10 二楼 房间2 2010-12-02 23:00:00 30
19 二楼 房间1 2010-12-02 23:00:00 40
相减为80

20 二楼 房间2 2010-12-02 23:00:00 40)
ACMAIN_CHM 2010-12-21
  • 打赏
  • 举报
回复
楼主你即没有认真看你自己提供的数据,也没去试试别人给你的语句。

二楼 2010-12-02 20
二楼2010-12-01 最大时间之和为(30+30=60,即id=9、10所在行之和)

仔细看一下你的 id=9、10所在行 的日期
ACMAIN_CHM 2010-12-20
  • 打赏
  • 举报
回复
按照你的说法,我是算不出你那个 “二楼 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
ACMAIN_CHM 2010-12-20
  • 打赏
  • 举报
回复
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是怎么算出来的?!
kyle315 2010-12-20
  • 打赏
  • 举报
回复
可能我没说明白,我的意思是按照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有数据,就要考虑跨月计算。
wwwwb 2010-12-20
  • 打赏
  • 举报
回复
第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
小小小小周 2010-12-19
  • 打赏
  • 举报
回复
楼主能提供代码吗

56,687

社区成员

发帖
与我相关
我的任务
社区描述
MySQL相关内容讨论专区
社区管理员
  • MySQL
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧