修剪MySQL中的平均值

时间:2012-01-18 10:18:07

标签: mysql sql aggregate-functions

我想写一个函数来计算MySQL中一个简单的修剪平均值计算。该函数(显然)将是一个聚合函数。我是在MySQL中编写函数等的新手,所以可以提供一些帮助。

修剪均值的算法如下(伪代码):

CREATE AGGREGATE FUNCTION trimmed_mean(elements DOUBLE[], trim_size INTEGER)
RETURNS DOUBLE
BEGIN
   -- determine number of elements
   -- ensure that number of elements is greater than 2 * trim_size else return error
   -- order elements in ASC order
   -- chop off smallest trim_size elements and largest trim_size elements
   -- calculate arithmetic average of the remaining elements
   -- return arithmetic average
END

任何人都可以帮忙解决如何正确编写上述函数,以便与MySQL一起使用吗?

3 个答案:

答案 0 :(得分:1)

这不是一项小任务,你需要用c / c ++编写......


MySQL本身的一个选项是编写一个视图或标量函数,它可以按照您想要的方式聚合数据,但是来自特定的表。这显然将函数限制为单个源表,这可能并不理想。

解决这个问题的方法可能是有一个专门用于此功能的表 ...

  • 开始交易
  • 清除表格
  • 插入您的示例数据
  • 查询视图/功能

(或类似的东西)

这排除了GROUP BY变体,除非您使用动态sql或将参数传递给函数以获取特定的分组模式。

这一切都不太理想,对不起。

答案 1 :(得分:1)

看看这个例子(对于MySQL) -

创建测试表:

CREATE TABLE test_table (
  id INT(11) NOT NULL AUTO_INCREMENT,
  value INT(11) DEFAULT NULL,
  PRIMARY KEY (id)
);

INSERT INTO test_table(value) VALUES 
  (10), (2), (3), (5), (4), (7), (1), (9), (3), (5), (9);

让我们计算平均值(已编辑的变体):

SET @trim_size = 3;

SELECT AVG(value) avg FROM (
  SELECT value, @pos:=@pos + 1 pos FROM (SELECT * FROM test_table ORDER BY value) t1, (SELECT @pos:=0) t2
  ) t
WHERE pos > @trim_size AND pos <= @pos - @trim_size;

+--------+
| avg    |
+--------+
| 4.8000 |
+--------+

答案 2 :(得分:0)

我创建了一个精确地执行此操作的UDF,与此处https://support.office.com/en-us/article/trimmean-function-d90c9878-a119-4746-88fa-63d988f511d3

引用的Excel函数匹配

https://github.com/StirlingMarketingGroup/mysql-trimmean

用法

`trimmean` ( `NumberColumn`, double `Percent` [, integer `Decimals` = 4 ] )
  • `NumberColumn`

    • 要修整和平均的值列。
  • `Percent`

    • 要从计算中排除的数据点的分数。例如,如果percent = 0.2,则从20个点(20 x 0.2)的数据集中修剪4个点:该集合的顶部2个,底部2个。
  • `Decimals`

    • (可选)要输出的小数位数。默认值为4。