2015-10-20 54 views
-3

我創建了一個包含日期和資產價格的臨時表。我想要說明每日回報。當我使用LAG()時,它完美地工作,但是當我使用CROSS APPLY時,出現了一些問題。有人可以解釋我的錯誤在哪裏嗎?爲什麼CROSS APPLY工作不正常?

CREATE TABLE #returns (Data Date, s Float); 

INSERT INTO #returns (Data, s) VALUES ('20120618', 142), ('20120619', 122), ('20120620', 145), ('20120621', 148), ('20120622', 111); 

SELECT * 
FROM #returns 

SELECT Data, (s/LAG(s) OVER(ORDER BY Data) -1) 
FROM #returns 


SELECT tLater.Data, (tLater.s/tPrev2.s) - 1 
FROM #returns as tLater 
CROSS APPLY 
    (
    SELECT TOP 1 tPrev.s 
    FROM #returns as tPrev 
    WHERE tPrev.Data < tlater.Data 
    ORDER BY tPrev.Data 
    ) as tPrev2 
+2

'出問題了'。那是什麼? –

+2

你必須1)使用'OUTER APPLY'而不是'CROSS APPLY'來獲得第一條記錄,它沒有以前的記錄,並且2)使用'ORDER BY DESC'來獲取前一條記錄。 –

回答

3

你是alomst那裏,改變交叉適用於外部應用和外內聲明應用應該是排序依據遞減。

SELECT tLater.Data, (tLater.s/tPrev2.s) - 1 
FROM #returns as tLater 
OUTER APPLY 
    (
    SELECT TOP 1 tPrev.s 
    FROM #returns as tPrev 
    WHERE tPrev.Data < tlater.Data 
    ORDER BY tPrev.Data DESC 
    ) as tPrev2 
3

通常當你使用CROSS APPLY<(或相關子查詢),你想要的最大值不是最小。我的猜測是,你有順序錯誤:

SELECT tLater.Data, (tLater.s/tPrev2.s) - 1 
FROM #returns tLater CROSS APPLY 
    (SELECT TOP 1 tPrev.s 
     FROM #returns as tPrev 
     WHERE tPrev.Data < tlater.Data 
     ORDER BY tPrev.Data DESC 
--------------------------^ 
    ) tPrev2;