0

我有一个查询,我已经用来确定什么时候石英工作。我试图设计一种方法来确定石英工作何时落后或陷入困境。问题在于作业时间间隔不同,因此我希望在确定作业何时中断时能够使用“大于X的标准偏差”逻辑。有没有办法在MySQL中做到这一点?这将主要是:解析时间差异并除以mysql

(previous_fire_time - next_fire_time)/一个时间间隔= X性偏差

select job_group, job_name, 
     from_unixtime(prev_fire_time/1000) prev, 
     from_unixtime(next_fire_time/1000) next, 
     sec_to_time((next_fire_time - prev_fire_time)/1000) diff 
    from qrtz_triggers; 
+-----------+------------------------+--------------------------+--------------------------+----------------+ 
| job_group | job_name    | prev      | next      | diff   | 
+-----------+------------------------+--------------------------+--------------------------+----------------+ 
| jon  | media     | 2016-02-25 15:50:30.0000 | 2016-02-25 16:50:30.0000 | 01:00:00.0000 | 
| jon  | ListUpdater   | 2016-02-25 15:36:00.0000 | 2016-02-25 16:06:00.0000 | 00:30:00.0000 | 
| jon  | Resolver    | 2016-02-25 05:00:00.0000 | 2016-02-26 05:00:00.0000 | 24:00:00.0000 | 
| dan  | Resubmitter   | 2016-02-25 15:55:30.0000 | 2016-02-25 16:55:30.0000 | 01:00:00.0000 | 
| admin  | NetworkExecutor  | 2016-02-25 06:10:00.0000 | 2016-02-26 06:10:00.0000 | 24:00:00.0000 | | admin  | AUpdater       | 2016-02-21 03:00:00.0000 | 2016-02-28 03:00:00.0000 | 168:00:00.0000 | 
| admin  | alexaweb    | 2016-02-25 15:55:36.0000 | 2016-02-25 15:56:36.0000 | 00:01:00.0000 | 

回答

0

MySQL提供的聚合函数STDDEV() and some variants,带着一帮其他的统计功能一起。

如果你想了一堆的时间间隔的平均值(算术平均值),标准差从startend,你这样做:

SELECT AVG(end-start) mean, STDDEV(end-start) stddev 
    FROM table 

如果你想找到在表中的行是具有持续时间高于均值超过两个标准差,你这样做......

SELECT table.* 
    FROM table 
    WHERE (end-start) > (SELECT (AVG(end-start) + (2.0 * STDDEV(end-start))) 
        FROM table) 

应该让你开始那。

我做了一堆这种东西一次。我发现在我能够可靠地计算构成异常观测的标准偏差的数量之前,有必要获得相当大的“正常”观测数据集。我还发现,持续时间是一个很大的麻烦迹象:这些都是在完成之前被剔除的工作(这是一个技术术语)。

最后,我想你可能会稍微好一些,使用mean absolute deviation rather than standard deviation。它对极端异常值不太敏感。