Сохранение формулы (уравнений) в базе данных для последующего анализа (SQL Server 2005) - PullRequest
3 голосов
/ 15 марта 2012

Я рассчитываю линейные регрессии на основе набора данных.Я не знаю регрессионную модель или количество параметров во время компиляции.

Я сохраняю уравнение регрессии в базе данных SQL Server 2005 в виде строки

y = 3x^2 + 2x // just an example

Когда мне нужночтобы сделать прогноз, я извлекаю уравнение из базы данных, подставляю x предсказываемое мной значение и использую NCalc для оценки результирующей строки.

Этот метод, кажется,работает нормально, но мне интересно, есть ли лучший способ или встроенная функция SQL Server, которую я пропустил, которая позволила бы мне выполнять эти вычисления на стороне базы данных .

Ответы [ 4 ]

2 голосов
/ 12 июля 2012

Это не ответ, но у меня недостаточно репутации, чтобы комментировать.

"Вы могли бы написать хранимую процедуру CLR, в которой все еще используется NCalc для вычисления."

Вы МОЖЕТЕ сделать это, но помните, что вы можете добавлять только ссылки на проекты Sql Server, которые могут ссылаться только на другие проекты Sql Server.Таким образом, вы МОЖЕТЕ создать проект SqlServer и связать все файлы из проекта NCalc и попытаться создать его, но тогда вам придется сделать то же самое со всеми ссылками проекта NCalc.Не все из которых с открытым исходным кодом.Я полагаю, что вы МОЖЕТЕ использовать Reflector для декомпиляции всех этих ссылок и поместить эти файлы в проект SqlServer.

Но если бы вы все это сделали и, наконец, получили свое решение для сборки, вы, вероятно, обнаружите, что можете добавить ссылку только в качестве НЕПРАВИЛЬНОЙ ссылки, что означало бы, что вам придется начать изменять все видыразрешений SqlSever ...

В этот момент вы, вероятно, сдадитесь.

Я пытаюсь сказать, что здесь гораздо больше работы, чем предполагает первоначальный ответ!

2 голосов
/ 15 марта 2012

Я бы посоветовал поместить его в функцию по этим направлениям. Затем вы можете вызвать функцию напрямую, а также иметь возможность легко включать вычисленное значение в наборы представлений для отчетов.

CREATE FUNCTION dbo.getRegression 
( @xvalue AS NUMERIC(18,2) --set the precision and scale as appropriate for your data
)
RETURNS NUMERIC(18,2)
    AS
    BEGIN
        DECLARE @yvalue as NUMERIC (18,2) 
        set @yvalue = POWER(2,(3*@xvalue)) + (2*@xvalue)
        RETURN @yvalue
    END
;
2 голосов
/ 15 марта 2012

Вы можете написать хранимую процедуру CLR, которая все еще использует NCalc для выполнения вычислений.

1 голос
/ 15 марта 2012

В Sql Server что-то подобное Select 2+2 вернет 4. Итак, вы можете иметь хранимую процедуру, которая считывает строку из базы данных, а затем создает другую динамическую строку, назовем ее (@SQLString) и выполните этот запрос .

Например, в этом случае формула может быть х + 2, затем вы строите динамическую строку на основе этого и затем вызываете sp_executesql:

EXEC sp_executesql @SQLString

Однако, прежде чем идти по этому пути, вам следует прочитать эту статью о динамическом SQL .

Я верю, что ты делаешь это просто отлично.

...