2015-10-20 167 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;