MySQL Datetime - 间隙识别

时间:2011-06-03 12:01:24

标签: mysql datetime

我正在设计一个MySQL数据库,其中包含从远程源收集的每分钟数据。

我计划将数据表保存为datetime字段,因此每行可能有3个月的数据代表每分钟的值。

如何轻松识别数据中的差距?我应该使用日期时间吗?

我将使用PHP5作为应用程序本身。

谢谢, 吉姆

2 个答案:

答案 0 :(得分:0)

我给每一行一个唯一的顺序参考(1,2,3 ......)然后在表上自我加入

...from mytable t1 join mytable t2 where (t1.ref+1)=t2.ref

根据您存储日期的方式,您可以(以某种方式)减去日期并确定是否存在差距。将整个事物包装在一个查询中,该查询提取存在间隙的行。

您可能需要考虑将日期存储为特定开始日期的秒数。

答案 1 :(得分:0)

识别差距是一个有趣的问题。最好的方法取决于差距的大小,但这是解决问题的另一种方法,如果差距与你所拥有的记录数相比相当大,则可能会更好。

在查询中使用MySQL聚合函数来计算一组存储桶的记录数。桶需要与您感兴趣的间隙大小相似。假设您对近一天左右的间隙感兴趣,我会做这样的事情:

SELECT TO_DAYS(my_timestamp), COUNT(*)
FROM my_table
GROUP BY TO_DAYS(my_timestamp)

这将返回天数和时间戳计数之间的关联。我会用Perl或Java(甚至是R,见后面)这样的语言来处理数据。

我使用的技术将测试观察到的频率(计数)和预期频率之间的差异,这将是记录的总数除以日期范围。每天的预期频率如下:

SELECT (SELECT COUNT(*) FROM my_table) / 
        ((SELECT TO_DAYS(MAX(my_timestamp)) FROM my_table) - 
         (SELECT TO_DAYS(MIN(my_timestamp)) FROM my_table) + 1)

现在,对于每个桶(记住在第一个结果中,完全丢失的天数将不会被返回,不会返回为零计数 - 您需要将它们视为零,您可以使用统计测试,卡方检验,估计这是偶然的概率(详见:http://en.wikipedia.org/wiki/Pearson%27s_chi-square_test)。计算基本上((预期 - 观察)^ 2 /预期)。这是一个估计偏离的可能性。

如果您需要确定样本中哪些存储桶较低,请在此计算值上设置合理的阈值,并查找值超过阈值的存储桶。设计适当的值可能需要一些实验,但这是确定差距的合理方法。