MySQL   发布时间:2022-05-15  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了计算MySQL中风向的平均值大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

我在新行上每隔10秒就有一张带风向的表格(以及其他天气值).
方向存储为度数:0 – 360.

目的

这个平均值是什么意思?数据库每隔10秒存储一行信息.对于性能问题,我想将5天之前的数据汇总到每小时一(平均)线.

随着温度很容易实现:avg(temp)可以解决问题,因为温度不会在很多不同的值之间跳跃.

随着盛行风,获得这种“平均”要困难得多.

以度为单位计算平均风向并不像使用聚合函数avg()那样简单,因为它是一个圆,例如:

dir1 = 10; dir2 = 350;
avg() = (10+350)/2 = 180;

哪个不准确;它应该是:0或360.

因此,在我的脑海中,我的大学三角学课程认为,如果我将其转换为@R_107_4403@,并计算x和y分量,我将能够重新计算平均方向.

在@R_450_11161@中,$w [‘w’]是存储在数据库中的方向.

while($w = $stmt->fetch()){
    $x += cos(deg2rad($w['w']));
    $y += sin(deg2rad($w['w']));     
}

$angle = atan2($y,$X);
$angle = 360 + round(rad2deg($anglE));

这个公式是否正确?

如果这个公式是正确的;理想情况下,我想获得MysqL的完整功能.我是这样做的;但我发现很多()的……

(360 + degrees(atan2(sum(sin(@R_107_4403@(W))),sum(cos(@R_107_4403@(W))))))) AS angle
最佳答案
初始建议的问题是它总是增加360,而如果atan2给出负面结果,你真的只想添加360.这可以用IF语句排序,但它比原始语言更笨重!

IF( degrees (atan2( sum(sin(@R_107_4403@(WindDirection))),sum(cos(@R_107_4403@(WindDirection))) ) )<>degrees ( atan2( sum(sin(@R_107_4403@(WindDirection))),sum(cos(@R_107_4403@(WindDirection))) )),degrees(atan2(sum(sin(@R_107_4403@(WindDirection))),sum(cos(@R_107_4403@(MastDirection))) )) ) AS angle 

第二种解决方案不能用于时间平均,因为它不是聚合函数.

我管理的最佳解决方案实际上使用了一个存储函数,如果您拥有数据库的权限,则可以创建该函数,如下所示:

create functION Vavg (sumsindir FLOAT,sumcosdir FLOAT) 
RETURNS FLOAT DETERMINISTIC 
RETURN IF( degrees(atan2(sumsindir,sumcosdir))<>degrees(atan2(sumsindir,sumcosdir)),degrees(atan2(sumsindir,sumcosdir)))

然后,您可以通过调用查询中的函数来计算平均值:

SELECT VavgTest( sum(sin(@R_107_4403@(WindDirection))),sum(cos(@R_107_4403@(WindDirection))) ) AS vectorAverage FROM table GROUP BY HOUR(Mytimestamp),DAYOFYEAR(Mytimestamp),YEAR(Mytimestamp)
ORDER BY Mytimestamp;

我已经将该组包括在内,以指出平均程序适用于任何平均周期.

我怀疑,实际的最佳答案是使用用户定义的函数,但我没有管理它,因为它必须在C或C中完成,我没有这些语言的任何背景.

大佬总结

以上是大佬教程为你收集整理的计算MySQL中风向的平均值全部内容,希望文章能够帮你解决计算MySQL中风向的平均值所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。
标签: