我正在设计一个MySQL数据库,其中包含从远程源收集的每分钟数据。
我计划将数据表保存为datetime字段,因此每行可能有3个月的数据代表每分钟的值。
如何轻松识别数据中的差距?我应该使用日期时间吗?
我将使用PHP5作为应用程序本身。
谢谢, 吉姆
答案 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 /预期)。这是一个估计偏离的可能性。
如果您需要确定样本中哪些存储桶较低,请在此计算值上设置合理的阈值,并查找值超过阈值的存储桶。设计适当的值可能需要一些实验,但这是确定差距的合理方法。