我正在尝试编写一个MySQL查询,该查询将计算值超过常量的次数。最终的结果是,我们可以通过值的振幅和频率来确定值的相对“噪声”。MIN()和MAX()提供振幅。Count()给出了符合条件的样本数量,但它不提供该值的稳定性。我们目前使用的是MySQL 5.7,但我们将迁移到提供窗口功能的MySQL 8.0。就像这样
Select Count(Value) over (order by logtime ROWS 1 Proeeding <123 AND 1 Following > 123) WHERE logtime BETWEEN...;感谢您能提供的任何帮助。
SELECT Count(Value) WHERE Value > 123 AND logtime BETWEEN...;
SELECT Count(Value) WHERE Value < 123 AND logtime BETWEEN...;发布于 2019-01-03 07:54:48
窗口函数在8.0之前的MySQL版本中不可用
在MySQL 5.7中,我们可以通过在精心设计的查询中使用用户定义的变量来模拟一些窗口函数。MySQL参考手册给出了关于在这样的上下文中使用用户定义变量的明确警告。我们所依赖的行为是不能保证的。
但作为我将用来实现指定结果的模式的一个示例:
SELECT SUM(c.crossed_avg) AS count_crossed_avg
FROM (
SELECT IF( ( @prval > a.avg_ AND t.value < a.avg_ ) OR
( @prval < a.avg_ AND t.value > a.avg_ )
,1,0) AS crossed_avg
, @prval := t.value AS value_
FROM mytable t
CROSS
JOIN ( SELECT 123 AS avg_ ) a
CROSS
JOIN ( SELECT @prval := NULL ) i
WHERE ...
ORDER BY t.logtime
) c要解压它,首先关注内联视图查询;也就是说,忽略SELECT SUM()包装器查询,只运行内联视图查询。
我们按logtime对行进行排序,这样我们就可以按顺序处理行。
我们将当前行上的值与前一行中的值进行比较。如果一个高于平均值,另一个低于平均值,则返回1,否则返回0。
将当前值保存到自定义变量中,以便比较下一行。(注意:操作的顺序很重要;在对IF()函数求值之后,我们将依靠MySQL来完成这项任务。
当行值恰好等于平均值时,示例查询没有解决边缘情况,例如,值序列124.4 < 123.0 < 122.2。(我们可能想要考虑更改比较,以便包括相等,例如<和>=。
https://stackoverflow.com/questions/54014360
复制相似问题