Ich versuche, eine lineare Regression Skript zu umschreiben zu werden eine Funktion, und ich erhalte die folgenden Fehler (die ich ia Thread hier), wenn ich das Skript ausführen:T-SQL-Funktion Syntax
Msg 156 , Ebene 15, Status 1, Prozedur fn_LinearRegression, Zeile 9 Falsche Syntax in der Nähe des Schlüsselwortes 'WITH'. Nachricht 319, Ebene 15, Status 1, Prozedur fn_LinearRegression, Zeile 9 Falsche Syntax neben dem Schlüsselwort 'mit'. Wenn es sich bei dieser Anweisung um einen allgemeinen Tabellenausdruck, eine xmlnamespaces-Klausel oder eine Änderungsverfolgungskontextklausel handelt, muss die vorherige Anweisung mit einem Semikolon abgeschlossen werden. Nachricht 156, Ebene 15, Status 1, Prozedur fn_LinearRegression, Zeile 12 Falsche Syntax neben dem Schlüsselwort 'AS'. Msg 102, Ebene 15, Status 1, Prozedur fn_LinearRegression, Zeile 18 Falsche Syntax in der Nähe von ','. Msg 102, Ebene 15, Status 1, Prozedur fn_LinearRegression, Zeile 28 Falsche Syntax in der Nähe von ','. Msg 102, Ebene 15, Status 1, Prozedur fn_LinearRegression, Zeile 36 Falsche Syntax in der Nähe von ','. Hier
ist die Funktion:
CREATE Function dbo.fn_LinearRegression
(@groupID varchar(50), @x int, @y float)
RETURNS @regtable TABLE(a FLOAT, b FLOAT)
AS
--
WITH some_table as (
select @groupID, @x, @y from TABLENAME -- replace table),
/*WITH*/ mean_estimates AS
( SELECT GroupID
,AVG(x) AS xmean
,AVG(y) AS ymean
FROM some_table pd
GROUP BY GroupID
),
stdev_estimates AS
( SELECT pd.GroupID
-- T-SQL STDEV() implementation is not numerically stable
,CASE SUM(SQUARE(x - xmean)) WHEN 0 THEN 1
ELSE SQRT(SUM(SQUARE(x - xmean))/(COUNT(*) - 1)) END AS xstdev
, SQRT(SUM(SQUARE(y - ymean))/(COUNT(*) - 1)) AS ystdev
FROM some_table pd
INNER JOIN mean_estimates pm ON pm.GroupID = pd.GroupID
GROUP BY pd.GroupID, pm.xmean, pm.ymean
),
standardized_data AS -- increases numerical stability
( SELECT pd.GroupID
,(x - xmean)/xstdev AS xstd
,CASE ystdev WHEN 0 THEN 0 ELSE (y - ymean)/ystdev END AS ystd
FROM some_table pd
INNER JOIN stdev_estimates ps ON ps.GroupID = pd.GroupID
INNER JOIN mean_estimates pm ON pm.GroupID = pd.GroupID
),
standardized_beta_estimates AS
( SELECT GroupID
,CASE WHEN SUM(xstd * xstd) = 0 THEN 0
ELSE SUM(xstd * ystd)/(COUNT(*) - 1) END AS betastd
FROM standardized_data
GROUP BY GroupID
)
SELECT pb.GroupID
,ymean - xmean * betastd * ystdev/xstdev AS Alpha
,betastd * ystdev/xstdev AS Beta
,CASE ystdev WHEN 0 THEN 1 ELSE betastd * betastd END AS R2
,betastd AS Correl
,betastd * xstdev * ystdev AS Covar
into TT_Auto_Temp_LM -- REPLACE TABLE
FROM standardized_beta_estimates pb
INNER JOIN stdev_estimates ps ON ps.GroupID = pb.GroupID
INNER JOIN mean_estimates pm ON pm.GroupID = pb.GroupID;
--
Insert into @regtable ([A],[B]) VALUES (Alpha, Beta)
RETURN
ich nur zwei Ausgänge haben, da ich nur Alpha und Beta benötigen.
'),' nach dem ersten CTE fehlt und nach meinem Wissen DML-Anweisungen in Funktion nicht zulassen, wenn Sie SQL Server verwenden –
Ich sehe nicht a), fehlt und ich habe eine Funktion im Einsatz, die eine INSERT INTO hat Aussage – preston