我正在设计一个MySQL数据库,它将包含从远程源收集的每一分钟的数据。
我计划让数据表包含一个datetime字段,因此我可能有3个月的数据,每行代表每分钟的值。
如何轻松识别数据中的差距?我应该使用datetime吗?
我将对应用程序本身使用PHP5。
谢谢,吉姆
发布于 2011-06-03 13:15:41
我会给每一行一个唯一的顺序引用(1,2,3...)然后在表上执行自连接
...from mytable t1 join mytable t2 where (t1.ref+1)=t2.ref
根据您存储日期的方式,您可以减去它们(以某种方式),并确定是否存在差距。将所有内容包装在一个查询中,该查询提取有空白处的行。
您可能需要考虑将日期存储为距特定开始日期的秒数。
发布于 2011-06-03 13:27:58
识别差距是一个有趣的问题。最好的方法将取决于差距的大小,但这里有另一种方法来解决它,如果与您拥有的记录数量相比,差距相当大,这种方法可能会更好。
在查询中使用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/预期)。这是对偏差可能性的估计。
如果您需要找出哪些存储桶在样本中较低,请对这个计算值设置一个合理的阈值,并查找该值超过阈值的存储桶。可能需要一些实验才能设计出合适的值,但这是确定差距的可靠方法。
https://stackoverflow.com/questions/6226840
复制