查找数据集中的整体波动

发布于 2024-10-20 04:04:25 字数 949 浏览 4 评论 0原文

我在 MySQL 数据库中有一组坦克的历史数据表。我想要查找大于 200 加仑/小时的罐内容物体积的波动。到目前为止我的SQL语句是:

SELECT t1.tankhistid as start, t2.tankhistid as end
FROM
    (SELECT * from tankhistory WHERE tankid = ? AND curtime BETWEEN ? AND ?) AS t1
INNER JOIN
    (SELECT * from tankhistory WHERE tankid = ? AND curtime BETWEEN ? AND ?) AS t2
    ON t1.tankid = t2.tankid AND t1.curtime < t2.curtime
WHERE TIMESTAMPDIFF(HOUR, t1.curtime, t2.curtime) < 1 AND ABS(t1.vol - t2.vol) > 200
ORDER BY t1.tankhistid, t2.tankhistid

在上面的代码中,curtime是插入记录时的时间戳,tankhistid是表整数主键,tankid是单个罐id,vol是卷读数。

这会返回太多结果,因为每 5 分钟收集一次数据,并且波动可能需要几个小时(结束列和开始列中具有相同 id 的多行),或者仅需要 10 分钟多一点(具有相同开始或结束 id 的多行)。输出示例:

7514576,7515478
7515232,7515478
7515314,7515478
7515396,7515478
7515478,7515560
7515478,7515642
7515478,7515724

请注意,所有这些行都应该是一个:7514576,7515724。仅查询一个坦克一天的数据就需要 4 分钟,因此任何加速都会很棒。我猜测有一种方法可以获取当前查询并将其用作子查询,但我不确定如何进行过滤。

I have a table of historic data for a set of tanks in a MySQL database. I want to find fluctuations in the volume of tank contents of greater than 200 gallons/hour. My SQL statement thus far is:

SELECT t1.tankhistid as start, t2.tankhistid as end
FROM
    (SELECT * from tankhistory WHERE tankid = ? AND curtime BETWEEN ? AND ?) AS t1
INNER JOIN
    (SELECT * from tankhistory WHERE tankid = ? AND curtime BETWEEN ? AND ?) AS t2
    ON t1.tankid = t2.tankid AND t1.curtime < t2.curtime
WHERE TIMESTAMPDIFF(HOUR, t1.curtime, t2.curtime) < 1 AND ABS(t1.vol - t2.vol) > 200
ORDER BY t1.tankhistid, t2.tankhistid

In the code above, curtime is a timestamp at the time of inserting the record, tankhistid is the table integer primary key, tankid is the individual tank id, and vol is the volume reading.

This returns too many results since data is collected every 5 minutes and fluctuations could take hours (multiple rows with the same id in an end and then start column) , or just over 10 minutes (multiple rows with the same start or end id). Example output:

7514576,7515478
7515232,7515478
7515314,7515478
7515396,7515478
7515478,7515560
7515478,7515642
7515478,7515724

Note that all of these rows should just be one: 7514576,7515724. The query takes 4 minutes for just one day of a tank's data, so any speed up would be great as well. I am guessing there is a way to take the current query and use it as a subquery, but I am not sure how to do the filtering.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文