【问题标题】:Create correlation function in MySQL 5在 MySQL 5 中创建关联函数
【发布时间】:2022-12-08 21:50:28
【问题描述】:

我正在尝试在 MySql 5 中创建一个相关函数,它包含两列 (x, y) 并返回一个十进制值 (correlation_coefficient)。

这是我的函数定义

-- Calculate pearson correlation coefficient.
-- INPUT: X and Y should be columns of data (decimal) 
-- RETURN: A value between -1 and 1 depending on the strength of the relationship between the 2 columns e.g. 0.43.

DELIMITER $$

CREATE FUNCTION PearsonCorrelation(
    x Decimal(10,1),
    y Decimal(10,1)
)
RETURNS Decimal(10,1)
DETERMINISTIC
BEGIN
    DECLARE correlation_coefficient  DECIMAL(3,2);
    SET correlation_coefficient = (avg(x * y) - avg(x) * avg(y)) / (sqrt(avg(x * x) - avg(x) * avg(x)) * sqrt(avg(y * y) - avg(y) * avg(y)));
    RETURN(correlation_coefficient);
END $$

DELIMITER ;

但是,当我执行函数调用时,出现错误“无效使用组函数”。这是一些测试数据,其中从数据集返回的相关系数应该是 0.86。

CREATE TABLE data_table
(
x Decimal(3,1) NOT NULL,
y Decimal(3,1) NOT NULL
)
INSERT INTO data_table 
VALUES(11.2, 10.4),
(9.7, 4.6),
(4.5, 2.1)

我打算按如下方式调用此函数:

Select PearsonCorrelation(x,y) as corrcoef
FROM data_table

鉴于反馈,我的问题可能会被重新定义为,是否可以将表列作为参数传递给相关函数,如果可以,我如何调整函数来实现这一点?

【问题讨论】:

  • 请通过提供样本数据和预期结果来澄清,因为功能没有意义。
  • 也许这可能与您的需求相关stackoverflow.com/questions/70014741/macro-concept-in-sql
  • 添加了测试数据。
  • - 您不能将表数据传递给函数,并且函数是自包含的,对调用语句中的表一无所知。而且您还没有展示如何调用该函数
  • 谢谢@P.Salmon。根据您的反馈,我已经更新了问题。

标签: mysql


【解决方案1】:

您正在尝试将表数据列传递给 MySQL 存储函数。你不能那样做™。 Aggregate functions like AVG() 只在像 SELECT 这样的 SQL 语句的上下文中工作——提到 FROM sometable 的语句。

你可以尝试这样的事情。

 SELECT (AVG(x * y) - AVG(x) * AVG(y)) /
        (SQRT(AVG(x * x) - AVG(x) * AVG(x)) *
         SQRT(AVG(y * y) - AVG(y) * AVG(y))) correlation_coefficient
  FROM data_table;

您应该知道 MySQL 在对它们进行算术运算之前会将所有数字转换为双精度浮点数。 DECIMAL(3,1) 可能不是数据格式的好选择。

其他一些品牌和版本的表服务器允许您创建自己的aggregate functions,但 MariaDB / MySQL 不行。

【讨论】:

  • 太好了,谢谢你的信息。我知道我可以按照你的回答写出来,我只需要使用函数 ALOT 所以我试图避免这种情况。谢谢。
【解决方案2】:

AVG()函数在这里没有意义..
仅在这样的选择语句中,它会为您提供平均值。

SELECT * FROM Products
WHERE Price > (SELECT AVG(Price) FROM Products);

只需从代码中删除所有 AVG()

【讨论】:

  • 谢谢。但是我仍然需要计算平均值?
  • 一个数字的平均值只是数字。根本不需要在这里使用平均值..
  • 我相信我会,因为我正在尝试计算两列之间的相关性。这不是逐行计算。我需要将人口统计数据理解为计算相关性的方程式的一部分。
  • 此函数有 2 个十进制参数。不是两个表列。检查这个:stackoverflow.com/a/39764039/4343230
猜你喜欢
  • 2014-01-04
  • 1970-01-01
  • 2015-12-13
  • 2013-02-17
  • 1970-01-01
  • 2011-03-17
  • 2014-12-17
  • 1970-01-01
  • 2019-09-23
相关资源
最近更新 更多