2011-09-05 80 views
4

我希望在设备连接之间创建平均时间差。如何在MySQL中创建记录之间的平均时间差?

我现在有了这个查询,这要归功于ajreal。我现在需要做的是创建每个设备记录之间的平均时间。

select device, count(*) as cnt, max(time) 
from database.table 
group by device 
having cnt>1 
order by device; 

我一直在玩弄TIMEDIFF但我需要的所有设备记录不只是最小值和最大值之间的平均水平。

表的结构类似于:

ID, device(string), 
data1(int),data2(int), 
time(timestamp), 
data3(int), 
data4(int) 

我怎么可能会实现我的目标是什么?

这是表格定义。

字段类型空键默认额外

ID INT(11)NO PRI NULL AUTO_INCREMENT 装置VARCHAR(15)NO MUL NULL
DATA1十进制(5,2)是NULL
DATA2十进制(5, 2)是NULL
时间时间戳是NULL
DATA3十进制(3,0)是NULL
DATA4十进制(3,0)是NULL

感谢看着我的亲布莱恩@克里斯亨利!

+0

是如何的差来计算?是像时间戳2 - 时间戳1,时间戳3 - 时间戳2,等 – ajreal

+0

我在找什么是第一个时间差(ts1 - ts2,为每个设备。谢谢 – pointhigh

+0

由于缺乏窗口功能,我不认为这可以用MySQL的合理方式完成。你可能会在你的应用程序 –

回答

2

你有你的时间戳转换为数字,以便能够详谈。当你有平均时间戳时,将其转换回日期。

select device, count(*) as cnt, FROM_UNIXTIME(AVG(UNIX_TIMESTAMP(time)), '%i:%s') 
from database.table 
group by device 
having cnt>1 
order by device; 

注意:如果你考虑负的时间,你的平均是显而易见的!如果你不那么它是一个更好的主意,用脚本语言来计算的话(PHP,C#,红宝石...)

average := avg(ts1–ts2, ts2-ts3, ts3-ts4) 
= (ts1–ts2 + ts2-ts3 + ts3-ts4)/3 
= (ts4-ts1)/3 

概括:

average = (last entry - first entry)/(number of entries - 1) 
+0

这很接近,返回的是设备记录的平均日期和时间,格式为yy-mm-dd hh:mm:ss。我期待的是连续一对记录之间的平均时间差(mm:ss)。 @pinouchon你的正确。你的笔记显示了正确的方法。 – pointhigh

+0

向'FROM_UNIXTIME'添加了格式化参数。格式化示例:'%Y%D%M%h:%i:%s%x'给出了2007年7月22日07:46:11 2007' –

1

这将让你的时间对于每一个事件(安全地无视 第一个)的差异:

SELECT 
    device, 
    TIME_TO_SEC(TIMEDIFF(time1, time0)) as diff 
FROM 
    table t0 
JOIN table t1 
    ON t0.device = t1.device 
    AND t0.time < t1.time 
LEFT JOIN table t2 
    ON t1.device = t2.device 
    AND t2.time < t1.time 
    AND t2.time > t1.time 
WHERE 
    t2.id IS NULL 

然后把这些由设备的平均值。

SELECT device, AVG(diff) 
FROM (
    put the above query here 
) AS tbl 
GROUP BY device 
0
SELECT device 
    , COUNT(*) AS cnt 
    , TIME_FORMAT(TIMEDIFF(MAX(`time`), MIN(`time`))/(COUNT(*)-1) 
        , '%H:%i:%s:%f') 
     AS avgTimeDiff 
FROM database.table 
WHERE `time` IS NOT NULL 
GROUP BY device 
HAVING COUNT(*) > 1 
ORDER BY device 
+0

我刚刚测试过您的查询,并且它仅接受计算平均值为3在26个设备中。其余的结果为NULL。它是在,'%H:%m:%s:%f'格式我试过这个变化,但它不能解决这个问题? – pointhigh

+0

@pointhigh:你可以试试这个版本吗?也许'时间'字段对于其余设备具有NULL值? –