我想写一个函数来计算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一起使用吗?
答案 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`
`Decimals`