Для назначения мне нужно заполнить тело пользовательской скалярной функции, чтобы вычислить простую модель линейной регрессии без результата перехвата в результате.Входные данные представляют собой два списка разделенных запятыми значений (каждый ввод по одной строке).Я должен как-то разбить строки вдоль запятых на отдельные значения с плавающей запятой для 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 в квадрате.