Digamos que usted tiene una tabla con columnas, Fecha, GroupID, X e Y.¿Hay alguna forma de calcular la correlación en TSQL usando las cláusulas OVER en lugar de las CTE?
CREATE TABLE #sample
(
[Date] DATETIME,
GroupID INT,
X FLOAT,
Y FLOAT
)
DECLARE @date DATETIME = getdate()
INSERT INTO #sample VALUES(@date, 1, 1,3)
INSERT INTO #sample VALUES(DATEADD(d, 1, @date), 1, 1,1)
INSERT INTO #sample VALUES(DATEADD(d, 2, @date), 1, 4,2)
INSERT INTO #sample VALUES(DATEADD(d, 3, @date), 1, 3,3)
INSERT INTO #sample VALUES(DATEADD(d, 4, @date), 1, 6,4)
INSERT INTO #sample VALUES(DATEADD(d, 5, @date), 1, 7,5)
INSERT INTO #sample VALUES(DATEADD(d, 6, @date), 1, 1,6)
y desea calcular la correlación de X e Y para cada grupo. Actualmente uso CTE, que ser un poco desordenado:
;WITH DataAvgStd
AS (SELECT GroupID,
AVG(X) AS XAvg,
AVG(Y) AS YAvg,
STDEV(X) AS XStdev,
STDEV(Y) AS YSTDev,
COUNT(*) AS SampleSize
FROM #sample
GROUP BY GroupID),
ExpectedVal
AS (SELECT s.GroupID,
SUM((X - XAvg) * (Y - YAvg)) AS ExpectedValue
FROM #sample s
JOIN DataAvgStd das
ON s.GroupID = das.GroupID
GROUP BY s.GroupID)
SELECT das.GroupID,
ev.ExpectedValue/(das.SampleSize - 1)/(das.XStdev * das.YSTDev)
AS
Correlation
FROM DataAvgStd das
JOIN ExpectedVal ev
ON das.GroupID = ev.GroupID
DROP TABLE #sample
Parece que debe haber una manera de utilizar una y otra partición para hacerlo de una sola vez y sin ninguna subconsulta. Idealmente TSQL tendría una función por lo que podría escribir:
SELECT GroupID, CORR(X, Y) OVER(PARTITION BY GroupID)
FROM #sample
GROUP BY GroupID
Me interesaría ver si alguien presenta una solución viable, sin embargo, siempre obtengo todos mis datos en la capa empresarial y realizo correlaciones allí. También realizamos lo que llamamos "correlaciones negativas", donde saltamos valores positivos y solo incluimos valores negativos, también sería interesante ver si esto era viable en SQL. –
El código que publicó no se ejecutó por varios motivos. Lo he cambiado para que realmente se ejecute, es posible que desee verificar que todavía hace lo que esperaba ... –
Si X o Y son anulables, debe reemplazar "FROM #sample" con "FROM # sample WHERE X IS NO NULO E Y NO ES NULO ", de lo contrario, puede terminar con la correlación incorrecta –