Mysql/ Grafana 计算/显示最后一小时/天/周/月的重量增量/减量
Posted
技术标签:
【中文标题】Mysql/ Grafana 计算/显示最后一小时/天/周/月的重量增量/减量【英文标题】:Mysql/ Grafana to calculate/display incremenet/ decrement of weight for the last hour/ day/ week/ month 【发布时间】:2021-11-01 07:40:55 【问题描述】:我有一个包含权重值的数据库。我正在寻找某种 mysql 选择/函数,我可以在 Grafana 中使用它来计算和显示:在最后一小时、最后一天、上周和上个月的时间内增加/减少体重。
值每小时发送到数据库,因此每个小时我都有不同的权重。体重可以增加也可以减少。
示例: 身份证 |重量 |时间戳 6560 | 42.6 | 2021-09-02 22:00:42 6559 | 42.3 | 2021-09-02 21:00:30 6558 | 41.8 | 2021-09-02 20:00:15 6557 | 41.5 | 2021-09-02 19:00:42 . . . 6536 | 39.8 | 2021-09-01 22:00:51
A) 最后一小时体重增加/减少 = 42.6 - 42.3 = 0.3 kg B) 最后一天体重增加/减少 = 2021-09-02 22:00:42 的值 - 2021-09-01 22:00:51 的记录值 = 42.6 - 39.8kg = 2.8 kg C) 上周 - 类似但每天可以使用平均函数 D) 上个月 - 类似但每周可以使用平均函数
感谢您的任何建议。
【问题讨论】:
请澄清您的具体问题或提供其他详细信息以准确突出您的需求。正如目前所写的那样,很难准确地说出你在问什么。 【参考方案1】:要查看每条记录在 1 小时、1 天和 1 周内的收益,请运行以下查询:
SELECT now.*
, now.weight - hour_ago.weight AS gain_1_hour
, now.weight - day_ago.weight AS gain_1_day
, now.weight - week_ago.weight AS gain_1_week
FROM weights AS now
LEFT JOIN weights AS hour_ago ON hour_ago.ts >= DATE_SUB(now.ts, INTERVAL 61 MINUTE) AND hour_ago.ts <= DATE_SUB(now.ts, INTERVAL 59 MINUTE)
LEFT JOIN weights AS day_ago ON day_ago.ts >= DATE_SUB(now.ts, INTERVAL 60 * 24 + 1 MINUTE) AND day_ago.ts <= DATE_SUB(now.ts, INTERVAL 60 * 24 - 1 MINUTE)
LEFT JOIN weights AS week_ago ON week_ago.ts >= DATE_SUB(now.ts, INTERVAL 7 * 60 * 24 + 1 MINUTE) AND week_ago.ts <= DATE_SUB(now.ts, INTERVAL 7 * 60 * 24 - 1 MINUTE)
ORDER BY now.ID
;
ts
(时间戳)字段必须被索引。
我建议您在应用程序中将时间戳值的输入从2021-09-02 22:00:42
、2021-09-02 21:00:30
修改为2021-09-02 22:00:00
、2021-09-02 21:00:00
。这将提高性能,上述查询将变为:
SELECT now.*
, now.weight - hour_ago.weight AS gain_1_hour
, now.weight - day_ago.weight AS gain_1_day
, now.weight - week_ago.weight AS gain_1_week
FROM weights AS now
LEFT JOIN weights AS hour_ago ON hour_ago.ts = DATE_SUB(now.ts, INTERVAL 1 HOUR)
LEFT JOIN weights AS day_ago ON day_ago.ts = DATE_SUB(now.ts, INTERVAL 1 DAY)
LEFT JOIN weights AS week_ago ON week_ago.ts = DATE_SUB(now.ts, INTERVAL 1 WEEK)
ORDER BY now.ID
;
【讨论】:
感谢您的建议和代码,这就是我一直在寻找的。不幸的是,我无法在应用程序中更改 ts (reading_time),因为它是当前时间戳(类型:时间戳,默认值:current_time)。您知道如何强制我的 mysql 服务器/数据库以以下格式保存当前时间戳:YYY-MM-DD HH:MM:00?这意味着每个时间戳记录将有等于“00”的秒数。这有可能吗?谢谢。 尝试使用 TRIGGER ... AFTER INSERT 更新时间戳,类似于@timestamp = DATE_SUB(@timestamp, INTERVAL SECOND(@timestamp) SECOND)
以上是关于Mysql/ Grafana 计算/显示最后一小时/天/周/月的重量增量/减量的主要内容,如果未能解决你的问题,请参考以下文章