MySQL:从时间序列数据中提取计数器差异
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了MySQL:从时间序列数据中提取计数器差异,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1991字,纯文字阅读大概需要3分钟。
内容图文
![MySQL:从时间序列数据中提取计数器差异](/upload/InfoBanner/zyjiaocheng/881/d444358447f74eb3b4fecb80e8fe85c9.jpg)
我有一个这样的MySQL表:
CREATE TABLE IF NOT EXISTS `mytable` (
`ts` datetime NOT NULL,
`cnt` int(10) unsigned NOT NULL,
PRIMARY KEY (`ts`)
) ENGINE=InnoDB;
每当有更新时,我们将事件计数器的值存储在哪里;这些更新在任意时间到达.
我如何提取每X时间(例如5分钟,一天,一个月等)中的事件数?我可以简化为通过日期/时间sql函数轻松提取的时间间隔(例如小时,天,月等).
尽管我们没有任何保证,但与我要提取的时间间隔相比,平均数据“密集”.例如.数据通常每小时产生多次,但我绝不会要求间隔< 1小时.如果存储的数据中存在“问题”(例如大孔),则结果中存在“问题”是可以接受的. 举例来说,我可以通过这样的查询(24小时周期示例)获得我感兴趣的计数器值:
SELECT ts, cnt
FROM mytable
GROUP BY DATE( ts )
ORDER BY ts DESC
…事件计数很容易通过将前一行的计数器减去每行的计数器来计算.但是,如果可能的话,我想用SQL做到这一点.
另外,如果这个问题有个好名字(当您使用时间序列和计数器时,我认为这是一个相当普遍的名字),我想知道它可以改善我的词汇量:)
解决方法:
如果将AUTO_INCREMENT PRIMARY KEY添加到表中,那是可以解决的.
您所呈现的表模式无效(时间戳上的主键,但没有此类列).
您介意我们:
ALTER TABLE mytable DROP PRIMARY KEY, ADD COLUMN id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY
?
如果是这样,那么可以完成以下操作,我将分步介绍:
SELECT
TIMESTAMPDIFF(SECOND, m1.ts, m2.ts) AS diff_seconds,
m2.cnt - m1.cnt AS diff_cnt
FROM
mytable m1 JOIN mytable m2 ON (m1.id = m2.id-1)
;
上面显示了连续样本之间的时间和cnt的差异.让我们添加第三列:
SELECT
TIMESTAMPDIFF(SECOND, m1.ts, m2.ts) AS diff_seconds,
m2.cnt - m1.cnt AS diff_cnt,
(m2.cnt - m1.cnt)/TIMESTAMPDIFF(SECOND, m1.ts, m2.ts) AS cnt_per_second
FROM
mytable m1 JOIN mytable m2 ON (m1.id = m2.id-1)
;
我评估了cnt_per_second.乘以60可得到每分钟cnt,依此类推.
现在,总平均值将为:
SELECT
avg(cnt_per_second)
FROM (
SELECT
TIMESTAMPDIFF(SECOND, m1.ts, m2.ts) AS diff_seconds,
m2.cnt - m1.cnt AS diff_cnt,
(m2.cnt - m1.cnt)/TIMESTAMPDIFF(SECOND, m1.ts, m2.ts) AS cnt_per_second
FROM
mytable m1 JOIN mytable m2 ON (m1.id = m2.id-1)
) sel_diff
;
如果您想知道何时记录差异,则将原始n1.ts添加到第一个查询中,这样您就可以知道给定时间段内的平均计数事件.
内容总结
以上是互联网集市为您收集整理的MySQL:从时间序列数据中提取计数器差异全部内容,希望文章能够帮你解决MySQL:从时间序列数据中提取计数器差异所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。