SQL:在标量用户定义函数中需要动态逻辑时遇到麻烦

时间:2018-11-29 07:24:29

标签: sql database mysql-workbench

对于一个作业,我必须填写一个用户定义的标量函数的主体,以计算一个简单的线性回归模型,而不会产生拦截项。输入是两个逗号分隔的浮点列表(每个输入为一个字符串)。我必须以某种方式将字符串沿逗号分割为X和Y的单独的浮点值,然后对它们进行适当的计算以获得返回斜率变量。

我尽力将字符串拆分为第一个浮点值,但是,我遇到了执行动态计算的问题,例如使用while循环从字符串中确定所有值。

对于UDF,有什么解决办法吗?大多数功能已经给出,我们必须使其与答案一起使用-我们无法对其进行大量更改,例如UDF是标量以及输入和返回参数。

我已经为此花了好几个小时不停的努力,即使我已经取得了进步,我也感到很高兴,但找不到类似的搜索内容。感谢您的任何事先帮助!

/*-- =============================================
-- Description: Calculates Simple Linear Regression Model Without The Intercept Term
-- Resources: http://en.wikipedia.org/wiki/Simple_linear_regression
-- Requirements of Task: Create a Scalar User Defined Function That Inputs Two -- -- Variable Comma
Separated Float String Lists And Calculates Simple Linear Regression Model Without The Intercept Term
as The Result.
*/
/*
SELECT cudf('1,2,3','1,2,3') AS SLOPE -- Result = 1
SELECT cudf('1,2,3','3,2,1')
AS SLOPE -- Result = -1
SELECT cudf
('1.47,1.50,1.52,1.55,1.57,1.60,1.63,1.65,1.68,1.70,1.73,1.75,1.78,1.80,1.83',
'52.21,53.12,54.48,55.84,57.20,58.57,59.93,61.29,63.11,64.47,66.28,68.10,69.92,72.19,74.46')
AS SLOPE -- Result = 61.2721865421079
*/
-- =============================================
DROP FUNCTION IF EXISTS `cudf`;
DELIMITER //
CREATE FUNCTION `cudf`
(

    cXPoints VARCHAR(255)
    ,cYPoints VARCHAR(255)

)
RETURNS FLOAT
BEGIN

-- Declare the return variable here
DECLARE Result DECIMAL(10, 4);

DECLARE beginV INT;
DECLARE countV INT;
DECLARE maxV INT;
DECLARE xVal FLOAT;
DECLARE xSum FLOAT;
DECLARE a INT(2); 
SET Result = NULL;
SET xSum = 0;
/* Your Magic / Answer / Solution Goes HERE :) */
WHILE length(cXPoints) > 0 AS LOOP
    BEGIN
        SET beginV= locate(',', cXPoints);
        SET xVal = CASE WHEN beginV = 0 THEn cXPoints ELSE SUBSTRING(cXPoints, 1, beginV - 1) END;
        SET xSum = xSum + xVal;
        #INSERT INTO TempTable2 Values(xVal);
        SET cXPoints = CASE WHEN beginV = 0 THEn cXPoints = '' ELSE SUBSTRING(cXPoints, beginV + 1, length(cXPoints) - beginV) END;
    END;
END; 

-- Return the result of the function
RETURN xSum;
END //
DELIMITER ;

这是我到目前为止所拥有的...我添加的行是一些变量和while循环。 while循环不起作用。如果我注释掉while循环,则内部代码仅在X列表的第一个变量上起作用。

数学逻辑(我认为)是返回每个x * y变量的总和除以每个x变量平方的总和。

0 个答案:

没有答案