首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >当数值超过平均值时如何计数

当数值超过平均值时如何计数
EN

Stack Overflow用户
提问于 2019-01-03 07:09:47
回答 1查看 31关注 0票数 0

我正在尝试编写一个MySQL查询,该查询将计算值超过常量的次数。最终的结果是,我们可以通过值的振幅和频率来确定值的相对“噪声”。MIN()和MAX()提供振幅。Count()给出了符合条件的样本数量,但它不提供该值的稳定性。我们目前使用的是MySQL 5.7,但我们将迁移到提供窗口功能的MySQL 8.0。就像这样

代码语言:javascript
复制
Select Count(Value) over (order by logtime ROWS 1 Proeeding <123 AND 1 Following > 123) WHERE logtime BETWEEN...;

感谢您能提供的任何帮助。

代码语言:javascript
复制
SELECT Count(Value) WHERE Value > 123 AND logtime BETWEEN...;

SELECT Count(Value) WHERE Value < 123 AND logtime BETWEEN...;
EN

回答 1

Stack Overflow用户

发布于 2019-01-03 07:54:48

窗口函数在8.0之前的MySQL版本中不可用

在MySQL 5.7中,我们可以通过在精心设计的查询中使用用户定义的变量来模拟一些窗口函数。MySQL参考手册给出了关于在这样的上下文中使用用户定义变量的明确警告。我们所依赖的行为是不能保证的。

但作为我将用来实现指定结果的模式的一个示例:

代码语言:javascript
复制
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。(我们可能想要考虑更改比较,以便包括相等,例如<>=

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54014360

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档