比方說,你有列,日期,組ID,X和Y是否有一種方法可以使用OVER子句而不是CTE計算TSQL中的相關性?
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)
一個表,要計算X和Y的每個組的相關性。目前我使用的CTE其變得有些混亂:
;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
這好像應該是過度使用做這一舉,沒有任何的子查詢的方式和分區。理想的情況是TSQL將有一個功能,所以你可以寫:
SELECT GroupID, CORR(X, Y) OVER(PARTITION BY GroupID)
FROM #sample
GROUP BY GroupID
我很想看看是否有人想出了一個可行的解決方案,但是,我總是我的所有數據拉來了業務層和執行的相關性存在。我們還進行我們所說的「負相關」 - 在這裏我們忽略正面的價值觀,只包括負值 - 這也將是有趣的,看看,如果這是在SQL可行的。 –
您發佈的代碼因各種原因未能執行。所以實際上它運行,你可能要驗證它仍然沒有任何你期待...... –
如果X或Y是空的,則需要更換「FROM #sample」與「FROM #sample其中X是我已經改變了它NOT NULL AND Y NOT NOT NULL「,否則最終會出現錯誤的相關性 –