нам нужен тип ввода, чтобы сделать его функцией SQL
CREATE Type XYTableType
AS TABLE (X float, Y float)
X может быть датой-временем, если вы хотите работать с временными рядами.я пытаюсь сделать эту функцию максимально простой
create FUNCTION dbo.fn_TrendLine(@Type TINYINT, @raw_data XYTableType READONLY)
RETURNS @TrendTable TABLE(X float, Y float, Yt float)
AS
BEGIN
DECLARE @n DECIMAL(38, 10),
@x DECIMAL(38, 10),
@x2 DECIMAL(38, 10),
@y DECIMAL(38, 10),
@xy DECIMAL(38, 10),
@y2 DECIMAL(38, 10),
@a DECIMAL(38, 10),
@b DECIMAL(38, 10)
SELECT
@n=COUNT(*),
@x= sum(CASE
WHEN @Type = 2 THEN X
WHEN @Type = 3 THEN LOG(X)
WHEN @Type = 4 THEN LOG(X)
ELSE X
END),
@x2=sum(CASE
WHEN @Type = 2 THEN X * X
WHEN @Type = 3 THEN LOG(X) * LOG(X)
WHEN @Type = 4 THEN LOG(X) * LOG(X)
ELSE X * X
END),
@y= sum(CASE
WHEN @Type = 2 THEN LOG(Y)
WHEN @Type = 3 THEN Y
WHEN @Type = 4 THEN LOG(Y)
ELSE Y
END),
@xy=sum(CASE
WHEN @Type = 2 THEN X * LOG(Y)
WHEN @Type = 3 THEN LOG(X) * Y
WHEN @Type = 4 THEN LOG(X) * LOG(Y)
ELSE X * Y
END),
@y2=sum(CASE
WHEN @Type = 2 THEN LOG(Y) * LOG(Y)
WHEN @Type = 3 THEN Y * Y
WHEN @Type = 4 THEN LOG(Y) * LOG(Y)
ELSE Y * Y
END)
FROM @raw_data
where Y is not null
set @a = (@x2 * @y - @x * @xy) / (@n * @x2 - @x * @x)
set @b = (@n * @xy - @x * @y) / (@n * @x2 - @x * @x )
if @Type in (2,4)
set @a = exp(@a)
INSERT INTO @TrendTable(X, Y, Yt)
SELECT X,Y,
Yt= case
WHEN @Type = 2 THEN @a *exp(log(exp(1))*(@b * X))
WHEN @Type = 3 THEN @a + @b * LOG(X)
WHEN @Type = 4 THEN @a * exp(log(X)*@b)
ELSE @a + @b * X
end
from @raw_data
RETURN
END
вот пример
DECLARE @raw_data XYTableType
insert into @raw_data
values (1,1.15),(2,1.82),(3,3.13),(4,4.28),(5,4.67),(6,5.79),(7,7.81),(8,8.35),(9,9.40),(10,9.98),(11,5.79),(12,7.81),(13,8.35),(14,9.40),(15,null),(16,null)
select * from dbo.fn_TrendLine(1, @raw_data)
select * from dbo.fn_TrendLine(2, @raw_data)
select * from dbo.fn_TrendLine(3, @raw_data)
select * from dbo.fn_TrendLine(4, @raw_data)
x15 и x16 для экстраполяцийВы можете просто скопировать результаты и вставить их в таблицу Excel для проверки графиков или встроенных функций Excel.я должен сказать это;
Нет: тип 3,4 не может работать с отрицательными значениями X, 2,4 не может работать с отрицательными значениями Y.Подготовка данных важна перед тем, как вы начнете вычислять определенные типы.