我正在尝试编写一个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...;
答案 0 :(得分:0)
在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。
将当前值保存到用户定义的变量中,以比较下一行。 (注意:操作顺序很重要;我们依靠MySQL在IF()
函数的求值之后 进行赋值。
当行值完全等于平均值时,例如,示例查询未解决边缘情况。值124.4
<123.0
<122.2
的序列。 (我们可能要考虑更改比较,以使其中包含等式,例如<
和>=
。