100分:求统计每天不同状态下的累计运行时间

kyle315 2011-04-11 10:35:27
有一表t
CREATE TABLE `t` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,

`f_id` varchar(45) NOT NULL,

`f_time` datetime NOT NULL,

`f_value` varchar(45) NOT NULL,

PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=gbk

insert into t (f_id,f_time,f_value) values
('A','2011-03-10 00:00:00',1),
('A','2011-03-10 11:00:00',0),
('A','2011-03-10 15:00:00',1),
('A','2011-03-10 16:00:00',0),
('A','2011-03-10 17:00:00',1),
('A','2011-03-10 23:59:59',1),
('B','2011-03-10 00:00:00',0),
('B','2011-03-10 8:00:00',1),
('B','2011-03-10 23:59:59',1),
('C','2011-03-10 00:00:00',1),
('C','2011-03-10 10:00:00',0),
('C','2011-03-10 23:59:59',0),
('D','2011-03-10 00:00:00',0),
('D','2011-03-10 23:59:59',0),
('E','2011-03-10 00:00:00',1),
('E','2011-03-10 23:59:59',1)

如何统计按f_id分组下,每天“1”状态(f_value字段的值)的累计时间,单位为分钟.
“1”状态时间是指f_value字段的值由“1”改变为“0”中间所经历的时间,
例如:
('A','2011-03-10 00:00:00',1),
('A','2011-03-10 11:00:00',0) 中间经历了11个小时,则1状态时间为11*60=660
或“1”改变为“1”时,中间所经历的时间(一种特殊情况),
例如:
('A','2011-03-10 17:00:00',1),
('A','2011-03-10 23:59:59',1) 中间经历了7个小时,则1状态时间为7*60=420
统计后结果如下:
f_id f_time f_value
A 2011-03-10 1140
B 2011-03-10 960
C 2011-03-10 840
D 2011-03-10 0
E 2011-03-10 1440
...全文
74 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
ACMAIN_CHM 2011-04-11
  • 打赏
  • 举报
回复
由于楼主的结果与他自己的说明并不一致,(可怜的中国语文教育机制)

如果以结果为准的话,则。

mysql> select f_id,date(f_time),sum(if(time(k)='23:59:59',1,0)+UNIX_TIMESTAMP(k)-UNIX_TIMESTAMP(f_time))/60 as m
-> from (
-> select f_id,f_time,
-> (select Min(f_time) From t Where f_id=a.f_id And f_time>a.f_time And DATE(f_time)=date(t.f_time)) as k
-> from t a
-> where f_value=1
-> ) b
-> where k is not null
-> group by f_id,date(f_time);
+------+--------------+-----------+
| f_id | date(f_time) | m |
+------+--------------+-----------+
| A | 2011-03-10 | 1140.0000 |
| B | 2011-03-10 | 960.0000 |
| C | 2011-03-10 | 600.0000 |
| E | 2011-03-10 | 1440.0000 |
+------+--------------+-----------+
4 rows in set (0.06 sec)

mysql>
ACMAIN_CHM 2011-04-11
  • 打赏
  • 举报
回复
mysql> select f_id,date(f_time),sum(UNIX_TIMESTAMP(k)-UNIX_TIMESTAMP(f_time))/60 as m
-> from (
-> select f_id,f_time,
-> (select Min(f_time) From t Where f_id=a.f_id And f_time>a.f_time And DATE(f_time)=date(t.f_time)) as k
-> from t a
-> where f_value=1
-> ) b
-> where k is not null
-> group by f_id,date(f_time);
+------+--------------+-----------+
| f_id | date(f_time) | m |
+------+--------------+-----------+
| A | 2011-03-10 | 1139.9833 |
| B | 2011-03-10 | 959.9833 |
| C | 2011-03-10 | 600.0000 |
| E | 2011-03-10 | 1439.9833 |
+------+--------------+-----------+
4 rows in set (0.08 sec)

mysql>
rucypli 2011-04-11
  • 打赏
  • 举报
回复
给表t加一列自增id列
select f_id,date(t1.f_time),(UNIX_TIMESTAMP(t1.f_time)-UNIX_TIMESTAMP(t2.f_time))/60
from t t1,t t2
where t1.id=t2.id-1
and t1.f_value=1 and t2.f_value=0
gungod 2011-04-11
  • 打赏
  • 举报
回复
直接求 最大和最小值的间隔怎么样?

select (select f_time from t where f_id='A' order by f_time desc limit 1 ) , (select f_time from t where f_id='A' order by f_time limit 1) into @t1,@t2;
select @t1,@t2,TIME_TO_SEC(TIMEDIFF(@t1,@t2));
ACMAIN_CHM 2011-04-11
  • 打赏
  • 举报
回复
你的计算结果有问题
[Quote]例如:
('A','2011-03-10 17:00:00',1),
('A','2011-03-10 23:59:59',1) 中间经历了7个小时,则1状态时间为7*60=420[/Quote]
这个没有7个小时,比7个小时少1秒。


select f_id,date(f_time),sum(UNIX_TIMESTAMP(k)-UNIX_TIMESTAMP(f_time))/60 as m
from (
select f_id,f_time,
(select Min(f_time) From t Where f_id=a.f_id And f_time>a.f_time And DATE(f_time)=date(t.f_time)) as k
from t a
where f_value=1
) b
where k is not null
group by f_id,date(f_time)
kyle315 2011-04-11
  • 打赏
  • 举报
回复
狼头兄,第一个就满足俺的要求,俺没加注释说明,不好意思,多谢了。
WWWWA 2011-04-11
  • 打赏
  • 举报
回复
SELECT DISTINCT A.F_ID,IFNULL(FF,0) FROM T A LEFT JOIN
(SELECT A.f_id,DATE(A.f_time),SUM(UNIX_TIMESTAMP(FF)-UNIX_TIMESTAMP(f_time))/60 AS FF FROM (
SELECT A.f_id,A.f_time,A.f_value,A.id,MIN(B.f_time) AS FF
FROM T A LEFT JOIN T B ON A.f_id=B.f_id AND B.f_time>A.f_time
WHERE A.f_value=1 AND B.f_id IS NOT NULL
GROUP BY A.f_id,A.f_time,A.f_value,A.id ) A
GROUP BY A.f_id,DATE(A.f_time)) A1
ON A.f_id=A1.F_ID
Re:CCNA_CCNP 思科网络认证 动态路由 EIGRP 和 OSPF 协议======================# EIGRP协议特点(CISCO产品专用独家协议) 使用Hello消息发现邻居,然后交换路由信息,使用Hello包维持邻居表 代替其它动态协议周期性更新而消耗资源。 有备用路径,当最佳路径不可用,立即使用备用路径 备用路径比动态获取新路径效率更高。 度量值默认为带宽和延迟,也可以添加负载和可靠性以及最大传输单元(MTU) rip只是hops跳数为依据,使用带宽和延时为指标更合理 还可以负载、可靠性和MTU为依据,选择最佳路径。 默认支持4条链路的不同代价的负载均衡,可以更改为最多6条 最大跳数为255(默认是100跳) rip只有15hops,所有只能够使用在小型网络中。 触发式更新路由表,即网络发生变化时,增量更新 hello包和触发式结合,消耗设置资源更低 支持路由的自动汇总。 支持大的网络,可以使用自制系统号来区别可共享路由信息的路由器集合,路由信息只可以在拥有相同自制系统号的路由器间共享。 (即一片路由和另一片路由,不计划发布沟通的情况下,可以以系统号区) 如同VLAN方式 管理距离是90 直连0静态路由1;rip协议120;EIGRP协议90(比rip优先级高) # EIGRP度量值 EIGRP度量值 带宽 延迟 可靠性 负载 最大路径和跳数 默认支持4条等价路径 最大跳数100,也可以设置成255 # EIGRP三张表 邻居关系表 拓扑表 路由表 # EIGRP专业术语 可行距离(FD)                :A到E最小开销的路径(最佳路径) 被通告距离(AD)            :A的前一个路由器,到E的开销 继任者(最佳路径)          :可行路径下一跳的路由器 可行的继任者(备用路径):被通告距离 ---------------------------------------------------------------------------------------# 介绍OSPF协议 开放最短路径优先(OSPF)是一个开放标准的路由选择协议,它被各种网络开发商所广泛使用。 即无厂家边界 # OSPF协议具有下列特性: 由区域和自治系统组成 最小化的路由更新的流量(触发式更新,平时hello包打招呼,类eigrp协议) 允许可缩放性 支持变VLSM和CIDR(五类间路由/23) 拥有不受限的跳数 允许多销售商的设备集成(开放的标准) 度量值是带宽 # OSPF术语 Router-ID(网络中的身份:取ip最大值) 网络中运行OSPF协议的路由器都要有一个唯一的标识,这就是Router-ID,并且Router-ID在网络中绝对不可以有重复。 COST(开销) OSPF协议选择最佳路径的标准是带宽,带宽越高计算出来的开销越低。到达目标网络的各个链路累计开销最低的,就是最佳路径。 链路(Link) 就是路由器上的接口,在这里,应该指运行在OSPF进程下的接口。 链路状态(Link-State) 链路状态(LSA)就是OSPF接口上的描述信息,例如接口上的IP地址,子网掩码,网络类型,Cost值等等,OSPF路由器之间交换的并不是路由表,而是链路状态(LSA)。 邻居(Neighbor) 两台或多台运行OSPF的路由器在一个公共的网络上形成的基本关系。 但是不一定交换信息 邻接(Adjacency) OSPF只有邻接状态才会交换LSA。 只有发生交换数据关系的设备间叫做邻接 邻居间选择一个交通站DR,负责邻居间交换数据--------------------------------------------------------------------------------------- # 在边界路由器通过再发布方式向内部网段传递默认路由 两个不同协议自治区:RIP 和 EIGRP 路由再发布 两个不同协议自治区:OSPF 和 EIGRP 路由再发布 两个不同协议自治区:OSPF 和 RIP 路由再发布------------------------------------------------------------------                

56,675

社区成员

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

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